實習經驗

布瑋發表於2018-09-19

實習


繼續努力吧,畢竟你在經歷別人沒有的經歷。 –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中間是: 大小寫也要注意

二.前端資料的處理

  1. 前端傳遞String字串,如果是float資料,避免強轉,比如:
float score=(float)map.get("score");這種做法是錯的
可以使用:
float score=Float.valueOf(map.get("score").toString());
  1. 前端傳輸資料為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、監控外部呼叫執行的工作。

相關文章