MP的自动填充
背景:
有的项目有“新增时间”、“修改时间”、“操作人”等字段,
比较笨的一个方法就是新增时
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 {
@Override
public void insertFill(MetaObject metaObect) {
setInsertFieldValByName("gmtCreate", LocalDataTime.now(), metaObject);
}
@Override
public void updateFill(MetaObject metaObect) {
setUpdateFieldValByName("gmtCreate", LocalDataTime.now(), metaObject);
}
}
也可以在不同的ff中使用通用的方法
setFieldValByName(fieldName, fieldVal, metaObject)
以上两步之后,在添加和修改数据时,MP会自动帮我们维护两个时间
3 对自动填充的优化
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObect) {
// 看实体类中是否有这个属性,有的话就执行。没有就不执行
boolean hasSetter = metaObject.hasSetter("gmtCreate");
if (hasSetter) {
setInsertFieldValByName("gmtCreate", LocalDataTime.now(), metaObject);
}
}
@Override
public void updateFill(MetaObject metaObect) {
// 如果预先自己设置了值,则设置不使用MP的自动填充
Object val = getFieldValByName("gmtModified", metaObject);
if (val == null) {
setUpdateFieldValByName("gmtModified", LocalDataTime.now(), metaObject);
}
}
}