多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
## 一、填充字段处理 需求案例:在插入数据的时候自动填充createTime和updateTime为当前插入数据的时间,在数据更新的时候修改updateTime为修改数据的时间。不需要人为的手动赋值。 * 在数据库表层面需要先添加2个日期类型的字段create\_tme和update\_time ![](https://img.kancloud.cn/c6/fe/c6fe35e8544d4cfc03cc2b2ddd884359_582x186.png) * 使用@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被自动赋值 ![](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)