![](https://cdn.zimug.com/wx-zimug.png)
本文为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
![](https://img.kancloud.cn/c6/fe/c6fe35e8544d4cfc03cc2b2ddd884359_582x186.png)
* 使用@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被自动赋值
![](https://img.kancloud.cn/fb/52/fb52690f32681d37e673852757ef2cdb_1616x104.png)
* 根据Id更新一条数据,注意我们没有为updateTime赋值
~~~
@Test
public void testUpdate() {
User user = new User();
user.setId(1287387821681790977L);
user.setName("字母哥&curry");
user.setAge(18);
userMapper.updateById(user);
}
~~~
但是运行的结果是:updateTime在执行数据记录修改操作时被自动赋值
![](https://img.kancloud.cn/e5/62/e562dacb7d35bfdfdae99d5d0ed262e0_1450x102.png)