本文為Mybatis Plus系列文章的第9篇,前8篇訪問地址如下:
- 小書MybatisPlus第1篇-整合SpringBoot快速開始增刪改查
- 小書MybatisPlus第2篇-條件構造器的應用及總結
- 小書MybatisPlus第3篇-自定義SQL
- 小書MybatisPlus第4篇-表格分頁與下拉分頁查詢
- 小書MybatisPlus第5篇-Active Record模式精講
- 小書MybatisPlus第6篇-主鍵生成策略精講
- 小書MybatisPlus第7篇-程式碼生成器的原理精講及使用方法
- 小書MybatisPlus第8篇-邏輯刪除實現及API細節精講
一、填充欄位處理
需求案例:在插入資料的時候自動填充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被自動賦值
- 根據Id更新一條資料,注意我們沒有為updateTime賦值
@Test
public void testUpdate() {
User user = new User();
user.setId(1287387821681790977L);
user.setName("字母哥&curry");
user.setAge(18);
userMapper.updateById(user);
}
但是執行的結果是:updateTime在執行資料記錄修改操作時被自動賦值
歡迎關注我的部落格,裡面有很多精品合集
- 本文轉載註明出處(必須帶連線,不能只轉文字):字母哥部落格。
覺得對您有幫助的話,幫我點贊、分享!您的支援是我不竭的創作動力! 。另外,筆者最近一段時間輸出瞭如下的精品內容,期待您的關注。