
本文為Mybatis Plus系列文章的第9篇,前8篇訪問地址如下:
* [小書MybatisPlus第1篇-整合SpringBoot快速開始增刪改查](http://www.zimug.com/other/springboot/%e5%b0%8f%e4%b9%a6mybatisplus%e7%ac%ac1%e7%af%87-%e6%95%b4%e5%90%88springboot%e5%bf%ab%e9%80%9f%e5%bc%80%e5%a7%8b%e5%a2%9e%e5%88%a0%e6%94%b9%e6%9f%a5/.html)
* [小書MybatisPlus第2篇-條件構造器的應用及總結](http://www.zimug.com/other/springboot/%e5%b0%8f%e4%b9%a6mybatisplus%e7%ac%ac2%e7%af%87-%e6%9d%a1%e4%bb%b6%e6%9e%84%e9%80%a0%e5%99%a8%e7%9a%84%e5%ba%94%e7%94%a8%e5%8f%8a%e6%80%bb%e7%bb%93/.html)
* [小書MybatisPlus第3篇-自定義SQL](http://www.zimug.com/other/java/%e5%b0%8f%e4%b9%a6mybatisplus%e7%ac%ac3%e7%af%87-%e8%87%aa%e5%ae%9a%e4%b9%89sql/.html)
* [小書MybatisPlus第4篇-表格分頁與下拉分頁查詢](http://www.zimug.com/other/springboot/%e5%b0%8f%e4%b9%a6mybatisplus%e7%ac%ac3%e7%af%87-%e8%a1%a8%e6%a0%bc%e5%88%86%e9%a1%b5%e4%b8%8e%e4%b8%8b%e6%8b%89%e5%88%86%e9%a1%b5%e6%9f%a5%e8%af%a2/.html)
* [小書MybatisPlus第5篇-Active Record模式精講](http://www.zimug.com/other/springboot/%e5%b0%8f%e4%b9%a6mybatisplus%e7%ac%ac5%e7%af%87-active-record%e6%a8%a1%e5%bc%8f%e7%b2%be%e8%ae%b2/.html)
* [小書MybatisPlus第6篇-主鍵生成策略精講](http://www.zimug.com/other/springboot/%e5%b0%8f%e4%b9%a6mybatisplus%e7%ac%ac6%e7%af%87-%e4%b8%bb%e9%94%ae%e7%94%9f%e6%88%90%e7%ad%96%e7%95%a5%e7%b2%be%e8%ae%b2/.html)
* [小書MybatisPlus第7篇-代碼生成器的原理精講及使用方法](http://www.zimug.com/other/java/%e5%b0%8f%e4%b9%a6mybatisplus%e7%ac%ac7%e7%af%87-%e4%bb%a3%e7%a0%81%e7%94%9f%e6%88%90%e5%99%a8%e7%9a%84%e5%8e%9f%e7%90%86%e7%b2%be%e8%ae%b2%e5%8f%8a%e4%bd%bf%e7%94%a8%e6%96%b9%e6%b3%95/.html)
* [小書MybatisPlus第8篇-邏輯刪除實現及API細節精講](http://www.zimug.com/other/java/%e5%b0%8f%e4%b9%a6mybatisplus%e7%ac%ac7%e7%af%87-%e9%80%bb%e8%be%91%e5%88%a0%e9%99%a4%e5%ae%9e%e7%8e%b0%e5%8f%8aapi%e7%bb%86%e8%8a%82%e7%b2%be%e8%ae%b2/.html)
## 一、填充字段處理
需求案例:在插入數據的時候自動填充createTime和updateTime為當前插入數據的時間,在數據更新的時候修改updateTime為修改數據的時間。不需要人為的手動賦值。
* 在數據庫表層面需要先添加2個日期類型的字段create_tme和update_time

* 使用@TableField注解標記實體類中的哪些字段需要填充:
~~~java
@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之后已經不建議使用
~~~java
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在執行數據記錄修改操作時被自動賦值
