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