Mybatis是如何把資料庫資料封裝到物件中的?
一、前言
接到一個問題,資料庫為Null的資料,傳遞到前端顯示為0,之前有了解過,持久層框架(mybatis)在把資料庫資料封裝到物件中,是利用物件的Setter方法,這個大家也都知道,因此我就在Setter方法嘗試,結果并不完全是這樣,下面我用例子演示,
二、準備階段
1.資料表

2.表對應的物體類
@Data
@ApiModel("用戶賬號")
public class User {
@ApiModelProperty(value = "用戶id")
Integer id;
@ApiModelProperty(value = "密碼")
String password;
@ApiModelProperty(value = "用戶名")
String name;
@ApiModelProperty(value = "狀態")
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介面

6.測驗
1.先獲取id為1的用戶賬號:
swagger2結果:
控制臺結果:

說明這里都有使用Setter方法賦值
2.再獲取id為2的用戶賬號:
swagger2結果:

控制臺結果:

首先,swagger2結果中 type為null,而不是我們期望的0;再就是,控制臺也只列印出了一句話,這是怎么回事呢?別急,我們接著往下看,
3.我準備在物體類中做點改變,再測驗獲取id為2的用戶賬號,如下:
改變后的物體類:

其他地方不變,看結果,首先,swagger2結果:

再看,控制臺結果:

小結:通過上面一些測驗結果,我斷言當資料庫資料為null時,框架不會呼叫該屬性的Setter方法為其賦值,而是會使用它的默認值,還有,從控制臺輸出順序可看出,呼叫Setter方法順序為資料表欄位從左至右依次開始封裝,
在此,我又冒出了一個新的想法,我想測驗前端傳到后端的json資料是不是也是這個結論,還是使用上面準備的環境開始測驗:
注意:物體類中@ApiModelProperty(value = "狀態")
Integer type;
先把swagger2中資料設定好

先看控制臺結果:

再看資料庫中資料:

小結:跟我預想的結果有些出入,本以type為null也不會呼叫Setter方法,因此,spring boot在封裝前端傳來的json資料時,就算資料為null,也會去呼叫Setter方法,
三、結尾
今天分享的內容簡單,不過也希望能幫助到你!如有問題,歡迎留言,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/237632.html
標籤:java
下一篇:面向物件之封裝(Java)
