1. 程式人生 > 程式設計 >詳解Mybatis是如何把資料庫資料封裝到物件中的

詳解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方法。

三、結尾

到此這篇關於詳解Mybatis是如何把資料庫資料封裝到物件中的的文章就介紹到這了,更多相關Mybatis 資料封裝到物件 內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!