mybatis-plus自动填充字段

329 阅读2分钟

我们在设计数据库表的时候一般来说有一些表必备的字段比如:

  • id: 主键,一个表必须得有主键,必须

  • create_time: 创建时间,必须

  • modifed_time: 修改时间,必须,更新记录时,需要更新它

  • version : 数据记录的版本号,用于乐观锁,非必须

  • remark :数据记录备注,非必须

  • modified_by :修改人,非必须

  • creator :创建人,非必须

像创建时间,修改时间,创建人,修改人这类的数据,我们通过mybatis-plus向数据库中插入数据的时候总会一次又一次的设置实体类的这个几个参数,是不是感觉很麻烦?确实是这样,下面我们来解决这个繁琐的操作。

使用mybatis-plus设置自动填充字段
首先我们定义一个配置类实现 MetaObjectHandler 然后重写相应的方法,设置我们自己要自动填充的字段和填充的值

举个例子

在这里我们只设置创建时间和修改时间这两个字段

@Component
public class MybatisPlusConfig implements MetaObjectHandler {
    private static final String GMT_CRATE = "gmtCreate";
    private static final String GMT_MODIFIED = "gmtModified";
    @Override
    public void insertFill(MetaObject metaObject) {//这个参数可以指代执行插入操作时传入的每个实体
        if (metaObject.hasGetter(GMT_CRATE) && metaObject.hasGetter(GMT_MODIFIED)) {//检查这个字段是不是有getter方法
            Date now = new Date();
            setFieldValByName(GMT_CRATE, now, metaObject);
            setFieldValByName(GMT_MODIFIED, now, metaObject);
        }
    }

    @Override
    public void updateFill(MetaObject metaObject) {//这个参数可以指代执行更新操作时传入的每个实体
        if (metaObject.hasGetter(GMT_MODIFIED)) {
            setFieldValByName(GMT_MODIFIED, new Date(), metaObject);
        }
    }
}

在实体类中我们通过注解@TableField来标识哪个字段要进行自动填充

/**
 * 创建时间
 */
@TableField(fill= FieldFill.INSERT)
private Date gmtCreate;

/**
 * 修改时间
 */
@TableField(fill= FieldFill.INSERT_UPDATE)
private Date gmtModified;

注意事项

  • 自动填充是直接给实体类的属性设置值。
  • 如果属性没有值,入库时会是 null
  • MetaObjectHandler 提供的默认方法策略是:如果属性有值则不覆盖,如果填充值为 null 则不填充。
  • 字段必须声明 @TableField 注解,并设置 fill 属性来选择填充策略。
  • 填充处理器需要在 Spring Boot 中声明为 @Component 或 @Bean
  • 使用 strictInsertFill 或 strictUpdateFill 方法可以根据注解 FieldFill.xxx、字段名和字段类型来区分填充逻辑。
  • 如果不需区分,可以使用 fillStrategy 方法。
  • 在 update(T entity, Wrapper<T> updateWrapper) 时,entity 不能为空,否则自动填充失效。
  • 在 update(Wrapper<T> updateWrapper) 时不会自动填充,需要手动赋值字段条件。

FieldFill枚举

public enum FieldFill {
    DEFAULT,       // 默认不处理
    INSERT,        // 插入填充字段
    UPDATE,        // 更新填充字段
    INSERT_UPDATE  // 插入和更新填充字段
}