該功能用於查詢產品詳情:
先上程式碼:
思路:
前端的資料傳到後臺後給Controller層(控制層)——> 控制層會呼叫Service層(服務層)提供的方法,服務層只定義介面(interface)——> 介面的功能實現是由implement層(實現層)提供的 ——> implement層實現介面時會呼叫dao層的方法 ——> 同樣,dao層提供的也只是定義的介面(interface),即在資料庫查詢方法的方法名——>對資料庫的真實操作(sql語句)是在xml檔案中寫的,mybatis會自動將同名的dao層介面和xml中的方法對應上。
接下來我們一行行解析程式碼:
@註釋部分:
@ApiOperation
@ApiOperation
不是spring自帶的註解,而是來自swagger裡的
com.wordnik.swagger.annotations.ApiOperation
(swagger見下面的Notes)
@ApiOperation
為API新增相關注解,它的引數說明如下:
@ApiOperation(value = “介面說明”, httpMethod = “介面請求方式”, response = “介面返回引數型別”, notes = “介面釋出說明”;其他引數可參考原始碼;
複製程式碼
Notes:
Swagger 是一款RESTFUL介面的文件線上自動生成+功能測試功能軟體。
Swagger 的目標是為REST APIs定義一個標準的,與語言無關的介面,使人和計算機在看不到原始碼或者看不到文件或者不能通過網路流量檢測的情況下能發現和理解各種服務的功能。
使用時需要整合Swagger-springmvc到我們的專案中。
如果想獲得如下頁面,還需要整合Swagger-UI。
@RequestMapping
RequestMapping是一個用來處理請求地址對映的註解。
@RequestMapping(value = "getprodinfo", method = RequestMethod.POST)
// value:指定請求的實際地址
// URL: /api/dm/getprodinfo,這個地址是專案的介面文件裡提供的介面路徑,value與介面相對應
// method: 指定請求的method型別, GET、POST、PUT、DELETE等;
複製程式碼
方法的定義:
@RequestBody
1、@RequestBody
需要把所有請求引數作為json
解析,因此,不能包含key=value
這樣的寫法在請求url中,所有的請求引數都是一個json
。
2、直接通過瀏覽器輸入url時,@RequestBody
獲取不到json
物件,需要用java程式設計或者基於ajax
的方法請求,將Content-Type設定為application/json
(關於application/json
參考www.cnblogs.com/Zhaols/p/62…)
解析前端傳輸的資料
由請求報文的表可以看出使用者傳送請求的引數是prodCode
方法getProdInfo
的入參是msg,即Msg,想得到content需要將msg解析出來。
JSON.parseObject
是將Json字串轉化為相應的物件;
.getString
是取得string型別資料用。
IConstant.CONTENT
是在package com.cmge.foundation.contants
定義的介面靜態變數,放在同一個類中管理可以使程式碼更加清晰,定義形式如下:
/**
* 介面靜態變數
*/
public class IConstant {
/**
* 訊息體
*/
public static final String CONTENT="content";
}
複製程式碼
從資料庫查資料
1、CorProductNewInfo
是在package com.cmge.foundation.vo.cor;
中定義的一個類:
這個類與資料庫裡的cor_product表相對應,定義了一些變數,並且每個變數有其預設的get、set方法。
package com.cmge.foundation.vo.cor;
public class CorProductNewInfo {
private Integer id;
private String prodCode;
……
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getProdCode() {
return prodCode;
}
public void setProdCode(String prodCode) {
this.prodCode = prodCode;
}
複製程式碼
資料庫中的欄位:
2、findCorProductByProdCode
是在package com.cmge.foundation.service.cor;
中定義的介面:
介面需要實現,此介面是在package com.cmge.foundation.impl.cor;
中實現的。
這裡傳入的引數是proCode,與前面相對應。
return的同名方法屬於corProductMapper
,是dao層的,dao層的mapper.java檔案為其提供定義的interface,其實現直接是資料庫的查詢,在.xml檔案中。複製此方法名稱,在CorProductMapper.xml檔案中找到此方法。
corProductMapper與CorProductMapper檔案對應上是通過如下程式碼(與上一段程式碼在同一個類裡)
在CorProductMapper.xml
檔案中的此方法,可以完成對資料庫的查詢:
CorProductMapper.java
是dao層的java檔案。
CorProductMapper.xml
與 CorProductMapper.java
是通過mybatis結合的,.java檔案也有同名函式,如下:
返回型別是CorProductNewInfo
這裡回頭與service裡的方法對比一下:
處理資料庫中沒有的欄位:
modifyTime 和 createTime需要單獨賦值,因為文件如下:
前面所有獲取的資料都是prodInfo中的,屬於資料表cor_product,而這個表中並沒有這兩個時間,這兩個時間與proInfo同屬於content,所以需要單獨賦值。
把獲取的所有資料進行整合並返回給前端:
在第一句的宣告中,reContent就是一個容器,主要呼叫put()、get()方法;
reContent.put("user", obj);
複製程式碼
obj是之前宣告的一個類的物件,比如為user1,那麼就是把user這個物件放到了map容器中了,其中user只是物件的代號。
也可以在呼叫的時候取出,程式碼為
reContent.get(user);
複製程式碼
引數是前面寫的代號,得到的是user1這個物件。
注意最後一句要把reContent
成功返回