SpringBoot - MyBatis-Plus使用详解17(字段数据自动填充)
当我们执行插入或者更新操作时,如果没有设置值的属性,那么在数据表中要么是 null,要么保留原来的值。而使用公共字段自动填充功能,可以让我们在没有赋值时也能自动设置指定的值。
十七、字段数据自动填充
1,准备工作
(1)假设我们有如下一张用户信息表,下面演示“操作类型”和“操作时间”这两个字段如何通过自动填充功能进行赋值:

(2)首先使用 @TableField 注解标记实体类中的哪些字段需要填充,这里我们选择插入或更新都自动填充:
FieldFill 是一个枚举,用于指定在何种情况下会自动填充,有如下几种可选值:
- DEFAULT:默认不处理
- INSERT:插入填充字段
- UPDATE:更新填充字段
- INSERT_UPDATE:插入和更新填充字段
@Data public class UserInfo { private Integer id; private String userName; private String passWord; private Integer age; @TableField(fill = FieldFill.INSERT_UPDATE) private String operationType; @TableField(fill = FieldFill.INSERT_UPDATE) private Date operationTime; }
(3)接着编写公共字段填充处理器类,该类继承了 MetaObjectHandler 类,重写 insertFill 和 updateFill 方法,我们在这两个方法中获取需要填充的字段以及默认填充的值。
注意:
- 填充处理器 MyMetaObjectHandler 在 Spring Boot 中需要声明 @Component 或 @Bean 注入
- strictInsertFill 和 strictUpdateFill 方法第二个参数写的是实体类里的属性名,不是对应数据库字段名。
@Log @Component public class MyMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { log.info("start insert fill ...."); this.strictInsertFill(metaObject, "operationType", String.class, "新增"); this.strictInsertFill(metaObject, "operationTime", Date.class, new Date()); } @Override public void updateFill(MetaObject metaObject) { log.info("start update fill ...."); this.strictUpdateFill(metaObject, "operationType", String.class, "修改"); this.strictUpdateFill(metaObject, "operationTime", Date.class, new Date()); } }
- 如果是 3.3.0 后面的版本,比如 3.3.1.8,也可以改用下面更简单的写法(3.3.0 不要用该方法,有 bug)
@Log @Component public class MyMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { log.info("start insert fill ...."); this.fillStrategy(metaObject, "operationType", "新增"); this.fillStrategy(metaObject, "operationTime", new Date()); } @Override public void updateFill(MetaObject metaObject) { log.info("start update fill ...."); this.fillStrategy(metaObject, "operationType", "修改"); this.fillStrategy(metaObject, "operationTime", new Date()); } }
2,开始测试
(1)首先创建一个对象插入到数据库,可以看到虽然我们并未设置 operationType 和 operationTime 值,但程序会自动填充这两个值到数据库中:
UserInfo user = new UserInfo(); user.setUserName("hangge"); user.setPassWord("123"); userInfoMapper.insert(user);

(2)接着执行更新操作,同样有自动填充的效果:
UserInfo user = new UserInfo(); user.setId(53); user.setAge(888); userInfoMapper.updateById(user);
