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