Mybatis-Plus 的自動填充


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM