小書MybatisPlus第9篇-常用欄位預設值自動填充

字母哥部落格發表於2020-07-27

本文為Mybatis Plus系列文章的第9篇,前8篇訪問地址如下:

一、填充欄位處理

需求案例:在插入資料的時候自動填充createTime和updateTime為當前插入資料的時間,在資料更新的時候修改updateTime為修改資料的時間。不需要人為的手動賦值。

  • 在資料庫表層面需要先新增2個日期型別的欄位create_tme和update_time

填充欄位處理-資料庫新建欄位

  • 使用@TableField註解標記實體類中的哪些欄位需要填充:
@Data
public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;

    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;
}

FieldFill是一個列舉,用於指定在何種情況下會自動填充,有如下幾種可選值:

  • DEFAULT:預設不處理
  • INSERT:插入時自動填充欄位
  • UPDATE:更新時自動填充欄位
  • INSERT_UPDATE:插入和更新時自動填充欄位

二、自定義填充預設數值

編寫公共欄位填充處理器類,該類繼承了MetaObjectHandler類,重寫 insertFill和updateFill方法,我們在這兩個方法中獲取需要填充的欄位以及預設填充的值。

  • 填充處理器MyMetaObjectHandler在Spring Boot中需要宣告@Component或@Bean注入
  • strictInsertFill和strictUpdateFill方法第二個引數寫的是實體類裡的屬性名,不是對應資料庫欄位名。
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
 
    @Override
    public void insertFill(MetaObject metaObject) {
        this.strictInsertFill(metaObject, "createTime", Date.class, new Date());
        this.strictInsertFill(metaObject, "updateTime", Date.class, new Date());
    }
 
    @Override
    public void updateFill(MetaObject metaObject) {
        this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date());
    }
}

如果是3.3.0後面的版本,比如3.3.1.8,也可以改用下面更簡單的寫法(3.3.0不要用該方法,有bug)

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
 
    @Override
    public void insertFill(MetaObject metaObject) {
        this.fillStrategy(metaObject, "createTime", new Date());
        this.fillStrategy(metaObject, "updateTime", new Date());
    }
 
    @Override
    public void updateFill(MetaObject metaObject) {
        this.fillStrategy(metaObject, "updateTime", new Date());
    }
}

在一些比較舊的版本,為填充欄位設定值的API如下,3.3.0之後已經不建議使用

this.setFieldValByName("createTime",new Date(),metaObject);
 this.setFieldValByName("updateTime",new Date(),metaObject);

三、開始測試

  • 插入一條資料,注意我們沒有為createTime和updateTime賦值
@Test
public void testInsert() {
  User user = new User();
  user.setName("字母哥");
  user.setAge(18);

  userMapper.insert(user);
}

但是執行的結果是:createTime和updateTime被自動賦值
createTime和updateTime被自動賦值

  • 根據Id更新一條資料,注意我們沒有為updateTime賦值
@Test
public void testUpdate() {
  User user = new User();
  user.setId(1287387821681790977L);
  user.setName("字母哥&curry");
  user.setAge(18);

  userMapper.updateById(user);
}

但是執行的結果是:updateTime在執行資料記錄修改操作時被自動賦值
updateTime在執行資料記錄修改操作時被自動賦值

歡迎關注我的部落格,裡面有很多精品合集

  • 本文轉載註明出處(必須帶連線,不能只轉文字):字母哥部落格

覺得對您有幫助的話,幫我點贊、分享!您的支援是我不竭的創作動力! 。另外,筆者最近一段時間輸出瞭如下的精品內容,期待您的關注。

相關文章