小编先来解释下自动填充是做什么的,大家有没有在数据入库的时候,不管新增或者修改数据,都要手动来设置添加时间和修改时间。而且每个插入都需要设置,而且数据库还设置不能为空,就很烦恼。
虽然可以在数据库设置默认值,但小编没得数据库表修改权限呐,那就从技术上来解决这个问题吧。
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其他条件来更新时,是不会自动填充的。