不灭的焱

革命尚未成功,同志仍须努力下载JDK17

作者:php-note.com  发布于:2022-05-08 21:03  分类:Java框架/系统  编辑

一、引言

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

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

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接口,一个新增时填充的方法、一个修改时填充的方法

/**
 * 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其他条件来更新时,是不会自动填充的。

 

 

摘自:https://jiannan.blog.csdn.net/article/details/100974363