詳解Mybatis是如何把數(shù)據(jù)庫(kù)數(shù)據(jù)封裝到對(duì)象中的
一、前言
接到一個(gè)問題,數(shù)據(jù)庫(kù)為Null的數(shù)據(jù),傳遞到前端顯示為0。之前有了解過,持久層框架(mybatis)在把數(shù)據(jù)庫(kù)數(shù)據(jù)封裝到對(duì)象中,是利用對(duì)象的Setter方法,這個(gè)大家也都知道,因此我就在Setter方法嘗試,結(jié)果并不完全是這樣。下面我用例子演示。
二、準(zhǔn)備階段
1.數(shù)據(jù)表
2.表對(duì)應(yīng)的實(shí)體類
@Data @ApiModel("用戶賬號(hào)") public class User { @ApiModelProperty(value = "用戶id") Integer id; @ApiModelProperty(value = "密碼") String password; @ApiModelProperty(value = "用戶名") String name; @ApiModelProperty(value = "狀態(tài)") Integer type; public void setType(Integer type) { if (type == null) { this.type = 0; } else { this.type = type; } System.out.println("id為"+this.id+"的type = " + this.type); } public void setName(String name) { this.name = name; System.out.println("id為"+this.id+"的name = " + this.name); } }
這里用到的是lombok和swagger2注解
3.Controller層
@RestController @RequestMapping("/user") @Api(tags = "UserController", description = "用戶管理") public class UserController { @Autowired private UserDao userDao; @GetMapping("/getUser/{id}") @ApiOperation("獲取用戶賬號(hào)") public User getUser(@PathVariable @ApiParam("用戶id") Integer id) { return userDao.selectOne(id); } @PostMapping("/setUser") @ApiOperation("添加用戶賬號(hào)") public void setUser(@RequestBody User user) { userDao.insert(user); } }
圖方便,我就將UserDao直接注入U(xiǎn)serController層中,其中使用到spring boot注解加swagger2注解,稍后使用swagger2進(jìn)行測(cè)試
4.Dao層
public interface UserDao{ @Select("select * from user where id=#{id}") User selectOne(Integer id); @Insert("insert into user values(null,#{name},#{password},#{type})") void insert(User user); }
注意:dao接口需要被掃描到才能完成映射
5.swagger2接口
6.測(cè)試
1.先獲取id為1的用戶賬號(hào):
swagger2結(jié)果:
控制臺(tái)結(jié)果:
說明這里都有使用Setter方法賦值
2.再獲取id為2的用戶賬號(hào):
swagger2結(jié)果:
控制臺(tái)結(jié)果:
首先,swagger2結(jié)果中 type為null,而不是我們期望的0;再就是,控制臺(tái)也只打印出了一句話。這是怎么回事呢?別急,我們接著往下看。
3.我準(zhǔn)備在實(shí)體類中做點(diǎn)改變,再測(cè)試獲取id為2的用戶賬號(hào),如下:
改變后的實(shí)體類:
其他地方不變,看結(jié)果。首先,swagger2結(jié)果:
再看,控制臺(tái)結(jié)果:
小結(jié):通過上面一些測(cè)試結(jié)果,我斷言當(dāng)數(shù)據(jù)庫(kù)數(shù)據(jù)為null時(shí),框架不會(huì)調(diào)用該屬性的Setter方法為其賦值,而是會(huì)使用它的默認(rèn)值。還有,從控制臺(tái)輸出順序可看出,調(diào)用Setter方法順序?yàn)閿?shù)據(jù)表字段從左至右依次開始封裝。
在此,我又冒出了一個(gè)新的想法,我想測(cè)試前端傳到后端的json數(shù)據(jù)是不是也是這個(gè)結(jié)論。還是使用上面準(zhǔn)備的環(huán)境開始測(cè)試:
注意:實(shí)體類中@ApiModelProperty(value = "狀態(tài)") Integer type;
先把swagger2中數(shù)據(jù)設(shè)置好
先看控制臺(tái)結(jié)果:
再看數(shù)據(jù)庫(kù)中數(shù)據(jù):
小結(jié):跟我預(yù)想的結(jié)果有些出入,本以type為null也不會(huì)調(diào)用Setter方法。因此,spring boot在封裝前端傳來(lái)的json數(shù)據(jù)時(shí),就算數(shù)據(jù)為null,也會(huì)去調(diào)用Setter方法。
三、結(jié)尾
到此這篇關(guān)于詳解Mybatis是如何把數(shù)據(jù)庫(kù)數(shù)據(jù)封裝到對(duì)象中的的文章就介紹到這了,更多相關(guān)Mybatis 數(shù)據(jù)封裝到對(duì)象 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java操作mongodb之多表聯(lián)查的實(shí)現(xiàn)($lookup)
這篇文章主要介紹了java操作mongodb之多表聯(lián)查的實(shí)現(xiàn)($lookup),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03java 動(dòng)態(tài)代理的方法總結(jié)
這篇文章主要介紹了java 動(dòng)態(tài)代理的方法總結(jié)的相關(guān)資料,需要的朋友可以參考下2017-04-04JAVA匿名內(nèi)部類語(yǔ)法分析及實(shí)例詳解
這篇文章主要介紹了JAVA匿名內(nèi)部類語(yǔ)法分析及實(shí)例詳解,匿名內(nèi)部類可以使你的代碼更加簡(jiǎn)潔,它與局部類很相似,不同的是它沒有類名,如果某個(gè)局部類你只需要用一次,那么你就可以使用匿名內(nèi)部類。對(duì)此感興趣的可以了解一下2020-07-07劍指Offer之Java算法習(xí)題精講數(shù)組與字符和等差數(shù)列
跟著思路走,之后從簡(jiǎn)單題入手,反復(fù)去看,做過之后可能會(huì)忘記,之后再做一次,記不住就反復(fù)做,反復(fù)尋求思路和規(guī)律,慢慢積累就會(huì)發(fā)現(xiàn)質(zhì)的變化2022-03-03springboot項(xiàng)目如何使用切面記錄用戶操作日志
這篇文章主要介紹了springboot項(xiàng)目如何使用切面記錄用戶操作日志,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10Java中Lambda表達(dá)式之Lambda語(yǔ)法與作用域解析
這篇文章主要介紹了Java中Lambda表達(dá)式之Lambda語(yǔ)法與作用域解析重點(diǎn)介紹Lambda表達(dá)式基礎(chǔ)知識(shí),需要的朋友可以參考下2017-02-02