日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MybatisPlus 的 MetaObjectHandler 与 @TableLogic

發(fā)布時(shí)間:2025/3/12 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MybatisPlus 的 MetaObjectHandler 与 @TableLogic 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。