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);
}
}
}
