欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MybatisPlus的MetaObjectHandler與@TableLogic使用

 更新時(shí)間:2024年04月29日 09:22:33   作者:Bryant5051  
這篇文章主要介紹了MybatisPlus的MetaObjectHandler與@TableLogic使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

1.MetaObjectHandler 實(shí)現(xiàn)公共字段自動(dòng)填充功能

1.1 日常開(kāi)發(fā)中的公共字段

在日常的開(kāi)發(fā)過(guò)程中, DAO層的數(shù)據(jù)庫(kù)實(shí)體類(lèi)(Entity)中經(jīng)常會(huì)有一些公共字段如 create_by(創(chuàng)建人), create_time(創(chuàng)建時(shí)間) 等字段,與業(yè)務(wù)基本無(wú)關(guān)且屬于記錄本身的屬性字段。

這些字段通常會(huì)容易被大家忽視,每個(gè) Entity 都去處理一遍比較麻煩耗時(shí);如果忽略又會(huì)造成記錄本身屬性不完整,直到用到的時(shí)候才后悔莫及。

1.2 Mybatis Plus 中的解決方案

所以 Mybatis Plus 中的 MetaObjectHandler 就是針對(duì)這一問(wèn)題的良好解決方案。

MetaObjectHandler 中主要提供了兩個(gè)方法:

public interface MetaObjectHandler {
    
    /**
     * 插入元對(duì)象字段填充(用于插入時(shí)對(duì)公共字段的填充)
     *
     * @param metaObject 元對(duì)象
     */
    void insertFill(MetaObject metaObject);

    /**
     * 更新元對(duì)象字段填充(用于更新時(shí)對(duì)公共字段的填充)
     *
     * @param metaObject 元對(duì)象
     */
    void updateFill(MetaObject metaObject);
}

1.3 用法

1.3.1 定義公共字段超類(lèi),并在字段上添加注解

一般來(lái)說(shuō),這些公共字段我們都會(huì)封裝在一個(gè) Super Entity 類(lèi)中,所以在這個(gè)類(lèi)中,我們把所有更新和插入時(shí)需要做改動(dòng)的字段都加上 @TableField 注解,并且設(shè)置 fill 屬性。

舉例說(shuō)明:

@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è)枚舉類(lèi),其中定義了四種處理方法:

public enum FieldFill {
    /**
     * 默認(rèn)不處理
     */
    DEFAULT,
    /**
     * 插入時(shí)填充字段
     */
    INSERT,
    /**
     * 更新時(shí)填充字段
     */
    UPDATE,
    /**
     * 插入和更新時(shí)填充字段
     */
    INSERT_UPDATE
}

1.3.2 實(shí)現(xiàn) MetaObjectHandler 接口

定義一個(gè)類(lèi)實(shí)現(xiàn) MetaObjectHandler 中的 insertFillupdateFill 抽象方法:

public class MetaHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        // getFieldValByName 方法是父接口中的默認(rèn)方法,用字段名字通過(guò)反射獲取待插入對(duì)象中指定名字字段的值
        Object createTime = getFieldValByName("createTime", metaObject);
        if (Objects.isNull(createTime)) {
            //同理, setFieldValByName 方法也是父接口中的默認(rèn)方法,用字段名字通過(guò)反射設(shè)置待插入對(duì)象中指定名字字段的值
            //插入時(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);
        }
    }

    @Override
    public 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 目前的邏輯刪除

日常開(kāi)發(fā)中,大多數(shù)場(chǎng)景下數(shù)據(jù)并不需要物理刪除,而是采用一個(gè)字段來(lái)表示這個(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)邏輯未刪除值(該值可無(wú)、會(huì)自動(dòng)獲取全局配置)
     */
    String value() default "";

    /**
     * 默認(rèn)邏輯刪除值(該值可無(wú)、會(huì)自動(dòng)獲取全局配置)
     */
    String delval() default "";
}

所以當(dāng)我們需要用到邏輯刪除的字段時(shí),可以使用如下方式:

    @TableLogic(delval = "1", value = "0")
    private String delete;

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解Java如何利用位操作符創(chuàng)建位掩碼

    詳解Java如何利用位操作符創(chuàng)建位掩碼

    在本文中,我們來(lái)看看如何使用位操作符實(shí)現(xiàn)低級(jí)別的位掩碼。我們將看到我們?nèi)绾螌⒁粋€(gè)單一的int變量作為一個(gè)單獨(dú)的數(shù)據(jù)容器,感興趣的可以跟隨小編一起學(xué)習(xí)一下
    2022-10-10
  • 如何利用grep-console插件使Intellij idea顯示多顏色調(diào)試日志

    如何利用grep-console插件使Intellij idea顯示多顏色調(diào)試日志

    這篇文章主要介紹了利用grep-console插件使Intellij idea顯示多顏色調(diào)試日志,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Spring Security使用單點(diǎn)登錄的權(quán)限功能

    Spring Security使用單點(diǎn)登錄的權(quán)限功能

    本文主要介紹了Spring Security使用單點(diǎn)登錄的權(quán)限功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • 如何處理@PathVariable中的特殊字符問(wèn)題

    如何處理@PathVariable中的特殊字符問(wèn)題

    這篇文章主要介紹了如何處理@PathVariable中的特殊字符問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • JVM Client和Server端有什么區(qū)別

    JVM Client和Server端有什么區(qū)別

    這篇文章主要介紹了JVM Client和Server端有什么區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Gradle 6.6.1 安裝配置的詳細(xì)教程

    Gradle 6.6.1 安裝配置的詳細(xì)教程

    Gradle是一個(gè)基于Apache Ant和Apache Maven概念的項(xiàng)目自動(dòng)化構(gòu)建開(kāi)源工具。這篇文章主要介紹了Gradle 6.6.1 安裝配置的詳細(xì)教程,需要的朋友可以參考下
    2020-09-09
  • Mybatis-Plus Wrapper條件構(gòu)造器超詳細(xì)使用教程

    Mybatis-Plus Wrapper條件構(gòu)造器超詳細(xì)使用教程

    接口方法的參數(shù)中,會(huì)出現(xiàn)各種 Wrapper,比如 queryWrapper、updateWrapper 等。Wrapper 的作用就是用于定義各種各樣的條件(where)。所以不管是查詢(xún)、更新、刪除都會(huì)用到Wrapper
    2022-03-03
  • Java中this,static,final,const用法詳解

    Java中this,static,final,const用法詳解

    這篇文章主要介紹了Java中this,static,final,const用法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • 如何提高java代碼的重用性

    如何提高java代碼的重用性

    在本篇文章中小編給各位分享了關(guān)于如何提高java代碼的重用性的相關(guān)知識(shí)點(diǎn)內(nèi)容,有需要的朋友們參考下。
    2019-07-07
  • Spring如何使用通知?Advice?管理事務(wù)

    Spring如何使用通知?Advice?管理事務(wù)

    Spring 默認(rèn)采用聲明式事務(wù)管理(通過(guò)配置的方式) ,也可以實(shí)現(xiàn)編程式事務(wù)管理,這篇文章主要介紹了Spring使用通知Advice管理事務(wù),需要的朋友可以參考下
    2023-06-06

最新評(píng)論