小書MybatisPlus第9篇-常用字段默認值自動填充

  • 2020 年 7 月 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在執行數據記錄修改操作時被自動賦值

歡迎關注我的博客,裏面有很多精品合集

  • 本文轉載註明出處(必須帶連接,不能只轉文字):字母哥博客

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