企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
![](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)