当前位置: > > > SpringBoot - MyBatis-Plus使用详解17(字段数据自动填充)

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);
评论0