背景:
有的项目有“新增时间”、“修改时间”、“操作人”等字段,
比较笨的一个方法就是新增时new Date,修改时new Date。(或者是Java8的LocalDataTime.now())
或者:
在数据库中设置默认值。
自动填充实现
1 在实体类中属性上添加注解**@TableFied(fill=Field.INSERT)**
在MP中,此处fill的属性是有如下选择:
public enum FieldFill {
/**
* 默认不处理
*/
DEFAULT,
/**
* 插入时填充字段
*/
INSERT,
/**
* 更新时填充字段
*/
UPDATE,
/**
* 插入和更新时填充字段
*/
INSERT_UPDATE
}
2 添加一个填充处理器,需要实现接口MetaObjectHandler
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
/**
* 新增的时候自动填充
*
* @param metaObject
*/
@Override
public void insertFill(MetaObject metaObject) {
log.info("start insert fill ....");
this.setFieldValByName("createTime", new Date(), metaObject);
this.setFieldValByName("createBy", JwtUtil.getUserName(), metaObject);
this.setFieldValByName("updateTime", new Date(), metaObject);
this.setFieldValByName("updateBy", JwtUtil.getUserName(), metaObject);
this.setFieldValByName("isDel", 0, metaObject);
}
/**
* 更新的税后自动填充
*
* @param metaObject
*/
@Override
public void updateFill(MetaObject metaObject) {
log.info("start update fill ....");
this.setFieldValByName("updateBy", JwtUtil.getUserName(), metaObject);
this.setFieldValByName("updateTime", new Date(), metaObject);
}
}
也可以在不同的ff中使用通用的方法setFieldValByName(fieldName, fieldVal, metaObject)
以上两步之后,在添加和修改数据时,MP会自动帮我们维护两个时间
3 对自动填充的优化
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObect) {
// 看实体类中是否有这个属性,有的话就执行。没有就不执行
boolean hasSetter = metaObject.hasSetter("createTime");
if (hasSetter) {
setInsertFieldValByName("createTime", LocalDataTime.now(), metaObject);
}
}
@Override
public void updateFill(MetaObject metaObect) {
// 如果预先自己设置了值,则设置不使用MP的自动填充
Object val = getFieldValByName("createTime", metaObject);
if (val == null) {
setUpdateFieldValByName("createTime", LocalDataTime.now(), metaObject);
}
}
}