📚目录
- 填充策略枚举介绍
- 自定义填充策略枚举的数据
- 测试用例
- 插入填充
- 更新填充
 
- 结尾
 
填充策略枚举介绍
      使用mybatis-plus完成字段的填充,使用起来也比较方便,当我们往数据库插入一条数据时我们不需要在给指定字段上new Date() ,而是使用mybatis-plus的注解完成@TableField(fill = FieldFill.UPDATE)完成.并且提供了4种策略枚举让我们使用.按照自己的使用场景进行使用.

     我们通常会创建一个实体类基类用于继承,该基类上的字段在所有表中都应该存在,比如说创建时间,更新时间,创建者,更新者等信息.
例如我创建的基类

     在这里使用了2种策略枚举分别是FieldFill.INSERT 插入填充 ,FieldFill.UPDATE 更新填充,在实体类配置完还不够因为它并不知道我想填充什么数据,这个填充数据要我们自己来定义.
自定义填充策略枚举的数据
MetaObjectHandler接口是mybatis-plus为我们提供的的一个扩展接口,我们需要实现更新接口updateFill和创建接口insertFill并通过MetaObject的getValue方法获取我们需要做处理的值如更新的字段名.
创建
MyMetaObjectHandler实现MetaObjectHandler接口
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    private final static String CREATE_BY = "createBy";
    private final static String CREATE_TIME = "createTime";
    private final static String UPDATE_BY = "updateBy";
    private final static String UPDATE_TIME = "updateTime";
    /**
     * 插入元对象字段填充(用于插入时对公共字段的填充)
     * @param metaObject
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        try {
            Object createTime = metaObject.getValue(CREATE_TIME);
            Object createBy = metaObject.getValue(CREATE_BY);
            if (ObjectUtils.isNull(createTime)) {
                this.setFieldValByName(CREATE_TIME, new Date(), metaObject);
            }
            if (ObjectUtils.isNull(createBy)){
                //后续可以通过获取当前登录对象进行获取账号并设置我这边演示就默认cr
                this.setFieldValByName(CREATE_BY, "cr", metaObject);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 更新元对象字段填充(用于更新时对公共字段的填充)
     * @param metaObject
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        try {
            Object updateTime = metaObject.getValue(UPDATE_TIME);
            Object updateBy = metaObject.getValue(UPDATE_BY);
            if (ObjectUtils.isNull(updateTime)) {
                this.setFieldValByName(UPDATE_TIME, new Date(), metaObject);
            }
            if (ObjectUtils.isNull(updateBy)){
                //后续可以通过获取当前登录对象进行获取账号并设置我这边演示就默认up
                this.setFieldValByName(UPDATE_BY, "up", metaObject);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
由于演示项目所以并没有涉及到登录获取当前用户信息等操作,所以这里的更新和创建用户都使用默认值表示,看是否有效果.
测试用例
插入填充

打断点查看,由于我们没有给创建时间赋值所以是null,那么我们自己new Date()时间进去

插入日志:

数据库数据

更新填充
通过Id进行更新



数据库数据

结尾
通过这一系列的操作后,我们就可以不需要在业务代码中手动添加时间等字段,这样不是优雅起来了.



















