該功能用于查詢產(chǎn)品詳情:
先上代碼:
思路:
前端的數(shù)據(jù)傳到后臺(tái)后給Controller層(控制層)——> 控制層會(huì)調(diào)用Service層(服務(wù)層)提供的方法,服務(wù)層只定義接口(interface)——> 接口的功能實(shí)現(xiàn)是由implement層(實(shí)現(xiàn)層)提供的 ——> implement層實(shí)現(xiàn)接口時(shí)會(huì)調(diào)用dao層的方法 ——> 同樣,dao層提供的也只是定義的接口(interface),即在數(shù)據(jù)庫查詢方法的方法名——>對(duì)數(shù)據(jù)庫的真實(shí)操作(sql語句)是在xml文件中寫的,mybatis會(huì)自動(dòng)將同名的dao層接口和xml中的方法對(duì)應(yīng)上。
接下來我們一行行解析代碼:
@注釋部分:
@ApiOperation
@ApiOperation
不是spring自帶的注解,而是來自swagger里的
com.wordnik.swagger.annotations.ApiOperation
(swagger見下面的Notes)
@ApiOperation
為API添加相關(guān)注解,它的參數(shù)說明如下:
@ApiOperation(value = “接口說明”, httpMethod = “接口請(qǐng)求方式”, response = “接口返回參數(shù)類型”, notes = “接口發(fā)布說明”;其他參數(shù)可參考源碼;
Notes:
Swagger 是一款RESTFUL接口的文檔在線自動(dòng)生成+功能測(cè)試功能軟件。
Swagger 的目標(biāo)是為REST APIs定義一個(gè)標(biāo)準(zhǔn)的,與語言無關(guān)的接口,使人和計(jì)算機(jī)在看不到源碼或者看不到文檔或者不能通過網(wǎng)絡(luò)流量檢測(cè)的情況下能發(fā)現(xiàn)和理解各種服務(wù)的功能。
使用時(shí)需要集成Swagger-springmvc到我們的項(xiàng)目中。
如果想獲得如下頁面,還需要集成Swagger-UI。
@RequestMapping
RequestMapping是一個(gè)用來處理請(qǐng)求地址映射的注解。
@RequestMapping(value = "getprodinfo", method = RequestMethod.POST)
// value:指定請(qǐng)求的實(shí)際地址
// URL: /api/dm/getprodinfo,這個(gè)地址是項(xiàng)目的接口文檔里提供的接口路徑,value與接口相對(duì)應(yīng)
// method: 指定請(qǐng)求的method類型, GET、POST、PUT、DELETE等;
方法的定義:
@RequestBody
1、@RequestBody
需要把所有請(qǐng)求參數(shù)作為json
解析,因此,不能包含key=value
這樣的寫法在請(qǐng)求url中,所有的請(qǐng)求參數(shù)都是一個(gè)json
。
2、直接通過瀏覽器輸入url時(shí),@RequestBody
獲取不到json
對(duì)象,需要用java編程或者基于ajax
的方法請(qǐng)求,將Content-Type設(shè)置為application/json
(關(guān)于application/json
參考https://www.cnblogs.com/Zhaols/p/6274899.html)
解析前端傳輸?shù)臄?shù)據(jù)
由請(qǐng)求報(bào)文的表可以看出用戶發(fā)送請(qǐng)求的參數(shù)是prodCode
方法getProdInfo
的入?yún)⑹莔sg,即Msg,想得到content需要將msg解析出來。
JSON.parseObject
是將Json字符串轉(zhuǎn)化為相應(yīng)的對(duì)象;
.getString
是取得string類型數(shù)據(jù)用。
IConstant.CONTENT
是在package com.cmge.foundation.contants
定義的接口靜態(tài)變量,放在同一個(gè)類中管理可以使代碼更加清晰,定義形式如下:
/**
* 接口靜態(tài)變量
*/
public class IConstant {
/**
* 消息體
*/
public static final String CONTENT="content";
}
從數(shù)據(jù)庫查數(shù)據(jù)
1、CorProductNewInfo
是在package com.cmge.foundation.vo.cor;
中定義的一個(gè)類:
這個(gè)類與數(shù)據(jù)庫里的cor_product表相對(duì)應(yīng),定義了一些變量,并且每個(gè)變量有其默認(rèn)的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;
}
數(shù)據(jù)庫中的字段:
2、findCorProductByProdCode
是在package com.cmge.foundation.service.cor;
中定義的接口:
接口需要實(shí)現(xiàn),此接口是在package com.cmge.foundation.impl.cor;
中實(shí)現(xiàn)的。
這里傳入的參數(shù)是proCode,與前面相對(duì)應(yīng)。
return的同名方法屬于corProductMapper
,是dao層的,dao層的mapper.java文件為其提供定義的interface,其實(shí)現(xiàn)直接是數(shù)據(jù)庫的查詢,在.xml文件中。復(fù)制此方法名稱,在CorProductMapper.xml文件中找到此方法。
corProductMapper與CorProductMapper文件對(duì)應(yīng)上是通過如下代碼(與上一段代碼在同一個(gè)類里)
在CorProductMapper.xml
文件中的此方法,可以完成對(duì)數(shù)據(jù)庫的查詢:
CorProductMapper.java
是dao層的java文件。
CorProductMapper.xml
與 CorProductMapper.java
是通過mybatis結(jié)合的,.java文件也有同名函數(shù),如下:
返回類型是
CorProductNewInfo
這里回頭與service里的方法對(duì)比一下:
處理數(shù)據(jù)庫中沒有的字段:
modifyTime 和 createTime需要單獨(dú)賦值,因?yàn)槲臋n如下:
前面所有獲取的數(shù)據(jù)都是prodInfo中的,屬于數(shù)據(jù)表cor_product,而這個(gè)表中并沒有這兩個(gè)時(shí)間,這兩個(gè)時(shí)間與proInfo同屬于content,所以需要單獨(dú)賦值。
把獲取的所有數(shù)據(jù)進(jìn)行整合并返回給前端:
在第一句的聲明中,reContent就是一個(gè)容器,主要調(diào)用put()、get()方法;
reContent.put("user", obj);
obj是之前聲明的一個(gè)類的對(duì)象,比如為user1,那么就是把user這個(gè)對(duì)象放到了map容器中了,其中user只是對(duì)象的代號(hào)。
也可以在調(diào)用的時(shí)候取出,代碼為
reContent.get(user);
參數(shù)是前面寫的代號(hào),得到的是user1這個(gè)對(duì)象。
注意最后一句要把reContent
成功返回