詳解Mybatis是如何把數(shù)據(jù)庫數(shù)據(jù)封裝到對象中的
接到一個問題,數(shù)據(jù)庫為Null的數(shù)據(jù),傳遞到前端顯示為0。之前有了解過,持久層框架(mybatis)在把數(shù)據(jù)庫數(shù)據(jù)封裝到對象中,是利用對象的Setter方法,這個大家也都知道,因此我就在Setter方法嘗試,結(jié)果并不完全是這樣。下面我用例子演示。
二、準備階段1.數(shù)據(jù)表@Data@ApiModel('用戶賬號')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('獲取用戶賬號') public User getUser(@PathVariable @ApiParam('用戶id') Integer id) { return userDao.selectOne(id); } @PostMapping('/setUser') @ApiOperation('添加用戶賬號') public void setUser(@RequestBody User user) { userDao.insert(user); }}
圖方便,我就將UserDao直接注入UserController層中,其中使用到spring boot注解加swagger2注解,稍后使用swagger2進行測試
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接口1.先獲取id為1的用戶賬號:
swagger2結(jié)果:
控制臺結(jié)果:
說明這里都有使用Setter方法賦值
2.再獲取id為2的用戶賬號:
swagger2結(jié)果:
控制臺結(jié)果:
首先,swagger2結(jié)果中 type為null,而不是我們期望的0;再就是,控制臺也只打印出了一句話。這是怎么回事呢?別急,我們接著往下看。
3.我準備在實體類中做點改變,再測試獲取id為2的用戶賬號,如下:
改變后的實體類:
其他地方不變,看結(jié)果。首先,swagger2結(jié)果:
再看,控制臺結(jié)果:
小結(jié):通過上面一些測試結(jié)果,我斷言當數(shù)據(jù)庫數(shù)據(jù)為null時,框架不會調(diào)用該屬性的Setter方法為其賦值,而是會使用它的默認值。還有,從控制臺輸出順序可看出,調(diào)用Setter方法順序為數(shù)據(jù)表字段從左至右依次開始封裝。
在此,我又冒出了一個新的想法,我想測試前端傳到后端的json數(shù)據(jù)是不是也是這個結(jié)論。還是使用上面準備的環(huán)境開始測試:
注意:實體類中@ApiModelProperty(value = '狀態(tài)') Integer type;
先把swagger2中數(shù)據(jù)設(shè)置好
先看控制臺結(jié)果:
再看數(shù)據(jù)庫中數(shù)據(jù):
小結(jié):跟我預(yù)想的結(jié)果有些出入,本以type為null也不會調(diào)用Setter方法。因此,spring boot在封裝前端傳來的json數(shù)據(jù)時,就算數(shù)據(jù)為null,也會去調(diào)用Setter方法。
三、結(jié)尾到此這篇關(guān)于詳解Mybatis是如何把數(shù)據(jù)庫數(shù)據(jù)封裝到對象中的的文章就介紹到這了,更多相關(guān)Mybatis 數(shù)據(jù)封裝到對象 內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!
相關(guān)文章:
1. MySQL Delete 刪數(shù)據(jù)后磁盤空間未釋放的原因2. oracle 使用雜記23. MySQL性能優(yōu)化之一條SQL在MySQL中執(zhí)行的過程詳解4. 淺談數(shù)據(jù)庫日期類型字段設(shè)計應(yīng)該如何選擇5. MySql如何使用not in實現(xiàn)優(yōu)化6. Microsoft Office Access隱藏和顯示字段的方法7. MySQL中文亂碼問題解決方案8. MySQL創(chuàng)始人發(fā)郵件尋求中國幫助9. MYSQL(電話號碼,身份證)數(shù)據(jù)脫敏的實現(xiàn)10. Microsoft Office Access添加行的方法
