實習經驗
實習
繼續努力吧,畢竟你在經歷別人沒有的經歷。 –RuiDer
這篇文章來源於實習,本人外出實習,正值大二的自己還有些懵懂,找到實習公司格外欣喜。公司安排的第一個專案是一個公司內部考試系統,系統的功能包括管理員通過許可權建立試卷,釋出試卷,檢視試卷,編輯試卷,刪除試卷,批閱試卷,以及對於考生的選擇等等。對於公司內部人員可以實時在公司內部系統中進行試卷閱讀,完成考核,提交試卷,及時檢視試卷成績等功能。初次做功能相對複雜的系統,心理還是有點壓力的。在這期間遇到幾點問題,想和大家分享一下,也是我自己的總結吧。
文章目錄
開發流程學習
很簡單的流程,但是相對剛開始做專案的同學來說還是很新穎的
客戶需求 ---> 需求文件的製作(有相關人員專門負責) ---> 專案開發設計文件(這個非常重要,因為後面的開發過程都是依據它的,無論前端還是後端,都要依靠它,相當於一個媒介) ---> 專案開發介面文件製作(前後端開發交流使用,包括資料傳輸,訪問地址定義等等) ---> 最後才是敲程式碼(跟著流程速度才會提升)
學習製作專案開發設計文件
開發設計文件的要素有很多,說幾個最重要的
一.專案介紹
二.關鍵功能
三.核心演算法(核心邏輯)
www:who+where+what+資料落地
採用www方式即誰在哪做了什麼把資料放到哪了這樣的方式去描述各個模組
四.資料庫
4.1 說明
說明資料庫的作用等等
4.2 資料庫的列表
4.2.1每個資料庫表的說明
4.2.2資料庫表列表
五.介面設計
包括介面地址,前後端資料的傳輸方式,傳輸引數(欄位),型別,備註的說明以及返回資料的方式定義
具體學習
一.字串和日期的轉換:
字串 ---> 日期
SimpleDataFormat sdf=new SimpleDataFormat("yyyy-MM-dd HH:mm:ss");
Date date=sdf.parse(str);
日期 ---> 字串
SimpleDataFormat sdf=new SimpleDataFormat("yyyy-MM-dd HH:mm:ss");
String str=sdf.format(date);
注意bug:
yyyy-MM-dd HH:mm:ss 要和對應的時間一一對應,另外注意HH:mm中間是: 大小寫也要注意
二.前端資料的處理
- 前端傳遞String字串,如果是float資料,避免強轉,比如:
float score=(float)map.get("score");這種做法是錯的
可以使用:
float score=Float.valueOf(map.get("score").toString());
- 前端傳輸資料為JSONObject或者JSONArray時與Map、List之間的轉換
推薦博文
三.強轉費時
強轉費時,例如:
String str=(String)map.get("score");
與
String str=(map.get("score")).toString();
四.Mybatis向資料庫insert獲取insert後的id
使用Mybatis向資料庫insert,要想獲取insert後的id,方法如下:
在Mybatis下的mapper檔案中:
<insert id="add" useGeneratedKeys="true" keyProperty="id">
insert into user(Name,Age) values(#{user.name},#{user.age});
</insert>
這樣操作之後在專案中要注意獲取插入返回的id方法:
User user=new User();
user.setName("a");
user.setAge(10);
int x=userDao.add(user);
int userId=user.getId(); //注意這句userId!=x兩者不相同
注意:
上述中的x可能等於1,也有可能等於0。1代表插入成功,0代表插入失敗,如果插入了多行,則返回插入的行數,插入兩行,返回2;插入三行,返回3;插入n行,返回n
五.線上測試
使用xshell進行線上測試,在測試環境下測試。(線上測試意思就是
專案釋出到公司的伺服器上後的除錯方式)
步驟如下:
1.找到專案的log配置檔案,一般式logback.xml
2.檢視日誌的儲存路徑
3.使用xshell或者在Linux系統下找到日誌的儲存路徑
4.使用tail -nf [日誌檔名]進行日誌的檢視,這裡的n代表
行數,可以是任意一個數。
常用命令:
1.檢視日誌:tail -nf [日誌檔名]
2.檢視程式:ps -ef|grep [專案名稱]
3.檢視某個專案的堆情況:jmap -heap [程式id]
4.檢視堆的佔用情況:jamp -histo [程式id] | head -10 被哪些類佔用了
5.檢視棧的情況,是否死鎖:jstack -m [程式id] | head -10
6.檢視GC的情況:jstat -gcutil [程式id] n (n代表開始迴圈獲取gc的次數)
7.檢視某個程式啟動的引數:jinfo -flag [程式id]
8.殺死程式:kill -9 [程式id]
六.bug的原因
在專案中找不到bug的原因時,找找看,繼承介面的類中中有沒有在方法的頭部加上@Override ,這些低階錯誤會導致專案的程式中斷
七.String類的方法:
7.1 subString(b,e); b從0開始,包含0,e代表結尾,不包含這個角標
7.2 是否包含某個字元contains(char a)
十一.500報錯
500報錯很有可能是後臺程式碼錯誤!!
十一.程式碼規範習慣
程式碼規範習慣:
11.1 service層方法 讀使用query,get,find開頭
11.2 service層方法 寫使用update,delete開頭、
11.3 任何程式碼,具體說是Controller,Service層等類中勤於說明類或者方法的作用,引數是什麼等等,養成好習慣。
十二.字元"|"的字串spilit方法
包含字元"|"的字串不要使用spilit方法,會出錯。比如
String[] s="20|20".spilit("|");
for(int i=0;i<s.length;i++){
System.out.println(s[i]);
}
//輸出結果:
2
0
|
2
0
到這裡才結束,中間的這兩個空格也是列印出來的。可想,這個符號不好用,最 好不要用。
解決方案:
1.修改符號
2.替換符號
- 兩個方法的區別在於如果一個系統在測試時,首先插入到資料庫時使用到這個符號,那麼將導致所有插入的資料在資料庫中將全部包含這個符號,在客戶端檢視資料時,需要使用spilit方法分離該字串,就會出錯!!這時候可以用最笨的方法,就是一個一個資料去找,然後修改這個符號,這種方法可行度不好。
- 替換符號的意思就是在客戶端需要資料庫的資料時,在後端程式中做出判斷,如果字串包含"|",先用其他符號,例如","," "等符號替換它,再做字串分離,也就是使用spilit方法。
十二.SVN:
SVN是Subversion的簡稱,是一個開放原始碼的版本控制系統,相較於RCS、CVS,它採用了分支管理系統,它的設計目標就是取代CVS。網際網路上很多版本控制服務已從CVS遷移到Subversion。說得簡單一點SVN就是用於多個人共同開發同一個專案,共用資源的目的。
十三.前後端使用HashMap和List
注意使用HashMap和List的時候,在遇到迴圈的話儘量把HashMap放在迴圈裡面去new,不然會遇到很大的問題。
比如:
1.
List<HashMap<String,Object>> list=new ArrayList<HashMap<String,Object>>();
HashMap<String,Object> map=new HashMap<String,Object>();
for(int i=0;i<10;i++){
map.put("a",i);
list.add(map);
}
2.
List<HashMap<String,Object>> list=new ArrayList<HashMap<String,Object>>();
for(int i=0;i<11;i++){
HashMap<String,Object> map=new HashMap<String,Object>();
map.put("a",i);
list.add(map);
}
這兩段程式碼的區別在於map的為止不同,兩段程式碼的輸出結果分別是:
1.list:[{a:10},{a:10}...{a:10},{a:10}]
2.list: [{a:0},{a:1}...{a:8},{a:9},{a:10}]
區別很明顯,這種錯誤在前後端傳輸資料時尤為重要,這段程式碼是我親自使用前後端工具除錯的。。
十四.前端除錯工具
前端除錯工具的熟練使用,有助於專案的跟近。
chorme:F12開啟除錯工具
一般後端開發人員需要注意就是Network,這裡可以看到前後端互動的資料,互動方式(POST/GET),以及
請求的url,很方便
十五.專案增改操作
一個專案脫離不了增刪改查,但是呢,在這次實習專案中,我瞭解到在開發中很多開發人員將增和改兩個功能放在業務處理service的一個方法中,具體實現是這樣的,增和改的區別在於增操作建立在空白場景下,前端只需要傳輸資料即可,空白場景的意思是資料庫還沒有這條資料;而改操作建立在資料庫已經存在一條即將要被操作的資料條,前端傳輸的資料中還包括該條資料的id,或者主鍵,這樣以來最大的區別在於是否擁有id,而其他傳輸資料一致。所以,我的處理方式是加一條判斷語句:
...其他資料...
if(paramMap.get("id")!=null){
update(...); //更改資料
}
else{
add(...); //增加資料
}
如果遇到多個相關聯的資料表之間的資料增和改操作,比如a表的主鍵id是b卷的一個欄位,如下:
a表:
id|content
-|:-?:
1|“好”
b表:
id|aId|content
-|:-?:
1|1|“哈哈哈哈”
2|1|“黑乎乎”
3|1|“嗨嗨嗨”
諸如這樣的這張表相互關聯,實現增和改操作,我的實現如下(先刪後增):
//if語句主要用於修改操作,如果有id則是修改,否則為增加
if(paramMap.get("id")!=null){
a.delete(id); //a表刪除資料條
b.delete(id); //b表刪除資料條
}
...其他資料...
int id=a.add(資料); //a表增加資料條
b.add(資料,id); //b表增加資料
十六.除錯debug快捷鍵
: Eclipse逐步除錯debug快捷鍵:F6,一步到位:F8
: Ideal逐步除錯debug快捷鍵:F8
: eclipse檢視錶達式的結果:右擊選擇watch
十七.@RequestBody
當前端傳送資料是一個陣列時,如下paramMap,一定記著加上@RequestBody!!!!不然無法接受資料
@RequestMapping("add")
public Result add(@RequestBody Map<String,Object> paramMap){
...code...
}
十八.mapper檔案
mapper檔案的某些方法比如insert,返回資料型別如果是引用型別,
記著加上resultType或者resultMap
十九.@RestController註解
@RestController註解,相當於@Controller+@ResponseBody兩個註解的結合,
返回json資料不需要在方法前面加@ResponseBody註解了,但使用
@RestController這個註解,就不能返回jsp,html頁面,檢視解析器無
法解析jsp,html頁面
二十.資料庫的模糊查詢
0,-,[]
三個符號的使用,參考博文點選檢視
以及下面這種在mapper檔案中重要的模糊查詢方式!!!
1.字串模糊查詢
SELECT * FROM tableName
<WHERE>
<if test="name !=null">
AND name like CONCAT(CONCAT('%', #{name}), '%')
</if>
</WHERE>
2.時間模糊查詢
DATE_FORMAT(Time,’%Y-%m-%d’)的作用在於將時間生成String再做處理
SELECT * FROM tableName
<WHERE>
<if test="time !=null">
AND DATE_FORMAT(Time,'%Y-%m-%d')=#{time} //這裡的#{time}是字串,如果是Date型別,還需要轉換
//DATE_FORMAT(#{time},'%Y-%m-%d')
</if>
</WHERE>
二十一.mapper檔案@Param的使用
一般在mapper介面的方法中傳入引數時,比如int add(User user);
如果提交專案之後出現異常:There is no getter for property user in "xxx.User"
,那麼問題原因在於引數的傳遞需要加上@Param,如:int add(@Param(value="user") User user)
,切記這點
二十二.Jenkins
Jenkins功能包括:
1、持續的軟體版本釋出/測試專案。
2、監控外部呼叫執行的工作。
相關文章
- C# 學習經驗分享C#
- 實用的管理經驗
- 專科即將實習,求教各種經驗和建議
- Java學習過程中實戰開發經驗重要嗎?Java
- 經驗教訓:Instacart 的實時機器學習之旅 - shu機器學習
- Elasticsearch 實戰經驗總結Elasticsearch
- 深度學習模型設計經驗分享深度學習模型
- 強化學習-學習筆記10 | 經驗回放強化學習筆記
- Android 隨筆—— ConstraintLayout 實戰經驗AndroidAI
- px、em和rem實戰經驗REM
- 企業安全實踐經驗分享
- PICO & Unity VR實戰 經驗(1)UnityVR
- 谷歌機器學習43條規則:機器學習工程的最佳實踐經驗谷歌機器學習
- 工程師經驗分享2 --- 嵌入式大牛開發經驗心得之學習方向工程師
- 【經驗】學習android開發的步驟Android
- 前端學習路線及面試經驗前端面試
- Linux系統入門命令學習經驗Linux
- MYSQL學習與實驗(八)——儲存過程實驗MySql儲存過程
- 從零基礎到拿到網易Java實習offer,談談我的學習經驗Java
- Scrum與OKR融合實踐經驗分享ScrumOKR
- DOE - 最經濟的實驗設計
- MPP平臺實施工具,實施經驗+銀行資料倉儲模型建設經驗泛談模型
- 靜態路由練習實驗路由
- c primer plus 章節學習,經驗總結。
- 過來人的大資料學習經驗大資料
- UWP學習——來自前輩們的經驗
- 學習Linux必須掌握的命令!經驗分享Linux
- 頭條日常實習生面經
- 清軟英泰PLM實施經驗談
- 某大型能源公司RPA實施經驗分享
- Linux系統入門實操經驗分享Linux
- 大規模實施 OKR 的成功經驗OKR
- Sobol 序列並行化的實踐經驗並行
- Java面經 面試經驗 網際網路公司面試經驗 後端面試經驗Java面試後端
- 剛轉行1年測試新手:學習Python程式設計經驗實戰分享Python程式設計
- Hexo · 經驗Hexo
- vux · 經驗UX
- vue · 經驗Vue