MybatisPlus 的 MetaObjectHandler 与 @TableLogic
生活随笔
收集整理的這篇文章主要介紹了
MybatisPlus 的 MetaObjectHandler 与 @TableLogic
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 1.MetaObjectHandler 實現公共字段自動填充功能
- 1.1 日常開發中的公共字段
- 1.2 Mybatis Plus 中的解決方案
- 1.3 用法
- 1.3.1 定義公共字段超類,并在字段上添加注解
- 1.3.2 實現 MetaObjectHandler 接口
- 2. Mybatis Plus 實現邏輯刪除
- 2.1 目前的邏輯刪除
- 2.2 Mybatis Plus 提供的解決方案
1.MetaObjectHandler 實現公共字段自動填充功能
1.1 日常開發中的公共字段
在日常的開發過程中, DAO層的數據庫實體類(Entity)中經常會有一些公共字段如 create_by(創建人), create_time(創建時間) 等字段,與業務基本無關且屬于記錄本身的屬性字段。
這些字段通常會容易被大家忽視,每個 Entity 都去處理一遍比較麻煩耗時;如果忽略又會造成記錄本身屬性不完整,直到用到的時候才后悔莫及。1.2 Mybatis Plus 中的解決方案
所以 Mybatis Plus 中的 MetaObjectHandler 就是針對這一問題的良好解決方案。MetaObjectHandler 中主要提供了兩個方法:
public interface MetaObjectHandler {/*** 插入元對象字段填充(用于插入時對公共字段的填充)** @param metaObject 元對象*/void insertFill(MetaObject metaObject);/*** 更新元對象字段填充(用于更新時對公共字段的填充)** @param metaObject 元對象*/void updateFill(MetaObject metaObject); }1.3 用法
1.3.1 定義公共字段超類,并在字段上添加注解
一般來說,這些公共字段我們都會封裝在一個 Super Entity 類中,所以在這個類中,我們把所有更新和插入時需要做改動的字段都加上 @TableField 注解,并且設置 fill 屬性。舉例說明:
@Data public class BaseEntity implements Serializable {/*** 創建時間*/@TableField(value = "create_time", fill = FieldFill.INSERT)private Date createTime;/*** 更新時間*/@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)private Date updateTime;}FieldFill 是一個枚舉類,其中定義了四種處理方法:
public enum FieldFill {/*** 默認不處理*/DEFAULT,/*** 插入時填充字段*/INSERT,/*** 更新時填充字段*/UPDATE,/*** 插入和更新時填充字段*/INSERT_UPDATE }1.3.2 實現 MetaObjectHandler 接口
定義一個類實現 MetaObjectHandler 中的 insertFill 和 updateFill 抽象方法:
public class MetaHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {// getFieldValByName 方法是父接口中的默認方法,用字段名字通過反射獲取待插入對象中指定名字字段的值Object createTime = getFieldValByName("createTime", metaObject);if (Objects.isNull(createTime)) {//同理, setFieldValByName 方法也是父接口中的默認方法,用字段名字通過反射設置待插入對象中指定名字字段的值//插入時, createTime 字段默認為當前時間setFieldValByName("createTime", new Date(), metaObject);}Object updateTime = getFieldValByName(UPDATE_TIME_FIELD, metaObject);if (Objects.isNull(updateTime)) {setFieldValByName(UPDATE_TIME_FIELD, new Date(), metaObject);}}@Overridepublic void updateFill(MetaObject metaObject) {//更新時設置 updateTime 字段為當前時間setFieldValByName(UPDATE_TIME_FIELD, LocalDateTime.now(), metaObject);} }2. Mybatis Plus 實現邏輯刪除
2.1 目前的邏輯刪除
日常開發中,大多數場景下數據并不需要物理刪除,而是采用一個字段來表示這個字段是否刪除,也就是邏輯刪除。
通常情況下,我們需要在刪除的時候手動將這個值更新為被刪除的枚舉值。2.2 Mybatis Plus 提供的解決方案
在 Mybatis Plus 中,提供了一個 @TableLogic 注解, 代碼如下:
@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface TableLogic {/*** 默認邏輯未刪除值(該值可無、會自動獲取全局配置)*/String value() default "";/*** 默認邏輯刪除值(該值可無、會自動獲取全局配置)*/String delval() default ""; }所以當我們需要用到邏輯刪除的字段時,可以使用如下方式:
@TableLogic(delval = "1", value = "0")private String delete;總結
以上是生活随笔為你收集整理的MybatisPlus 的 MetaObjectHandler 与 @TableLogic的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: rap2检测哪些接口在使用_Apifox
- 下一篇: 初中计算机vb知识点,全国计算机等级考试