MyBatis-Plus 高级功能 —— 自动填充功能

x33g5p2x  于2021-12-19 转载在 其他  
字(2.2k)|赞(0)|评价(0)|浏览(345)

一、引言

小编先来解释下自动填充是做什么的,大家有没有在数据入库的时候,不管新增或者修改数据,都要手动来设置添加时间和修改时间。而且每个插入都需要设置,而且数据库还设置不能为空,就很烦恼。

虽然可以在数据库设置默认值,但小编没得数据库表修改权限呐,那就从技术上来解决这个问题吧。

if (medicalProcedures.isEmpty()) {
    procedureConverter.setHisname(emrIpdEncounters.get(0).getHisName());
    // 手动添加值
    procedureConverter.setCreateTime(new Date());
    procedureConverter.setUpdateTime(new Date());
    emrIpdMedicalRecordManage.addMedicalProcedure(procedureConverter);
}

二、自动填充实现

步骤一:在实体类字段上,通过注解方式设置需要在执行什么操作填充,一共有三种:新增、更新、更新和操作

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

    /**
     * 修改时间
     */
    @TableField(fill = FieldFill.UPDATE)
    private LocalDateTime updateTime;

步骤二:创建一个新的类,实现MetaObjectHanlder接口,一个新增时填充的方法、一个修改时填充的方法

/**
 * @Auther: IT贱男
 * @Date: 2019/9/18 10:23
 * @Description: MP自动填充类
 */
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    /**
     * 新增时填充
     *
     * @param metaObject
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        System.out.println("insertFill......");
        // createTime 对应实体属性名, 第二个参数需要填充的值
        setInsertFieldValByName("createTime", LocalDateTime.now(), metaObject);
    }

    /**
     * 修改时填充
     *
     * @param metaObject
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        System.out.println("updateFill......");
        // updateTime 对应实体属性名, 第二个参数需要填充的值
        setUpdateFieldValByName("updateTime", LocalDateTime.now(), metaObject);
    }
}

三、自动填充使用细节

细节一:这里的填充是针对整个数据库的新增或者更新,都会执行填充的步骤,像这种创建时间和修改时间数据库全表最好统一列名。

细节二:如果有些数据库的表没有创建时间和修改时间字段,如果在执行这些操作有点浪费,可以这样操作。

/**
     * 新增时填充
     *
     * @param metaObject
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        // 先判断是否存在该字段
        boolean createTime = metaObject.hasSetter("createTime");
        if (createTime) {
            System.out.println("insertFill......");
            setInsertFieldValByName("createTime", LocalDateTime.now(), metaObject);
        }
    }

细节三:有时候特殊表的填充字段,需要我们手动来设置值,但最后执行的时候又会被填充覆盖掉,看以下操作。

/**
     * 修改时填充
     *
     * @param metaObject
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        // 先判断该值是否为空,为空才填充
        Object updateTime = getFieldValByName("updateTime", metaObject);
        if (updateTime == null) {
            System.out.println("updateFill......");
            setUpdateFieldValByName("updateTime", LocalDateTime.now(), metaObject);
        }
    }

细节四:自动填充功能不仅仅针对创建和修改时间,可根据项目需求所使用。

四、来自小伙伴们的补充

补充一:在使用更新自动填充时,只适用于updateById()来操作,如果平时使用Wrapper其他条件来更新时,是不会自动填充的。

相关文章