最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MybatisPlus的MetaObjectHandler與@TableLogic使用

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

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

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

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

這些字段通常會容易被大家忽視,每個 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 注解,并且設(shè)置 fill 屬性。

舉例說明:

@Data
public class BaseEntity implements Serializable {
    
    /**
     * 創(chuàng)建時間
     */
    @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 {
    /**
     * 默認(rèn)不處理
     */
    DEFAULT,
    /**
     * 插入時填充字段
     */
    INSERT,
    /**
     * 更新時填充字段
     */
    UPDATE,
    /**
     * 插入和更新時填充字段
     */
    INSERT_UPDATE
}

1.3.2 實現(xiàn) MetaObjectHandler 接口

定義一個類實現(xiàn) MetaObjectHandler 中的 insertFillupdateFill 抽象方法:

public class MetaHandler implements MetaObjectHandler {

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

2. Mybatis Plus 實現(xiàn)邏輯刪除

2.1 目前的邏輯刪除

日常開發(fā)中,大多數(shù)場景下數(shù)據(jù)并不需要物理刪除,而是采用一個字段來表示這個字段是否刪除,也就是邏輯刪除。

通常情況下,我們需要在刪除的時候手動將這個值更新為被刪除的枚舉值。

2.2 Mybatis Plus 提供的解決方案

Mybatis Plus 中,提供了一個 @TableLogic 注解, 代碼如下:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface TableLogic {

    /**
     * 默認(rèn)邏輯未刪除值(該值可無、會自動獲取全局配置)
     */
    String value() default "";

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

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

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

總結(jié)

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

相關(guān)文章

  • 在java中實現(xiàn)C#語法里的按引用傳遞參數(shù)的方法

    在java中實現(xiàn)C#語法里的按引用傳遞參數(shù)的方法

    下面小編就為大家?guī)硪黄趈ava中實現(xiàn)C#語法里的按引用傳遞參數(shù)的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-09-09
  • 如何理解Java線程池及其使用方法

    如何理解Java線程池及其使用方法

    線程池是首先創(chuàng)建一些線程,它們的集合稱為線程池。使用線程池可以提高性能,它在系統(tǒng)啟動時創(chuàng)建大量空閑的線程,程序?qū)⒁粋€任務(wù)傳給線程池,它就會啟動一條線程來執(zhí)行這個任務(wù),執(zhí)行結(jié)束以后,該線程并不會死亡,而是再次返回線程池中成為空閑狀態(tài),等待執(zhí)行下一個任務(wù)
    2021-06-06
  • Java,C#使用二進(jìn)制序列化、反序列化操作數(shù)據(jù)

    Java,C#使用二進(jìn)制序列化、反序列化操作數(shù)據(jù)

    這篇文章主要介紹了Java,C#使用二進(jìn)制序列化、反序列化操作數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下
    2014-10-10
  • java反編譯工具jd-gui-osx?for?mac?M1芯片無法使用的問題及解決

    java反編譯工具jd-gui-osx?for?mac?M1芯片無法使用的問題及解決

    這篇文章主要介紹了java反編譯工具jd-gui-osx?for?mac?M1芯片無法使用的問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Java教程各種接口的介紹

    Java教程各種接口的介紹

    Java教程各種接口的介紹,需要的朋友可以參考一下
    2013-02-02
  • struts2入門介紹及代碼實例

    struts2入門介紹及代碼實例

    這篇文章主要介紹了struts2入門介紹及代碼實例,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • Java8新特性Lambda表達(dá)式的一些復(fù)雜用法總結(jié)

    Java8新特性Lambda表達(dá)式的一些復(fù)雜用法總結(jié)

    lambda表達(dá)式是JAVA8中提供的一種新的特性,它支持Java也能進(jìn)行簡單的“函數(shù)式編程”。 下面這篇文章主要給大家介紹了關(guān)于Java8新特性Lambda表達(dá)式的一些復(fù)雜用法的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-07-07
  • Java反射的定義和用法詳解

    Java反射的定義和用法詳解

    Java中的反射是指在程序運行時動態(tài)地獲取和操作類、方法、屬性等元素的能力。它使得我們可以在程序運行時獲取一個類的信息,并對其進(jìn)行操作,需要的朋友可以參考下
    2023-05-05
  • Java線程間通訊的幾種方法小結(jié)

    Java線程間通訊的幾種方法小結(jié)

    線程通信可以用于控制并發(fā)線程的數(shù)量,本文主要介紹了Java線程間通訊的幾種方法小結(jié),文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-01-01
  • Java?開發(fā)中?for和Stream用法對比分析

    Java?開發(fā)中?for和Stream用法對比分析

    本文介紹了for循環(huán)和Stream在Java編程中的使用場景和區(qū)別,for循環(huán)適用于簡單的遍歷、中途退出、操作索引等場景,而Stream適用于多步驟數(shù)據(jù)處理、復(fù)雜邏輯、并行計算等場景,下面通過例子給大家詳細(xì)講解,感興趣的朋友一起看看吧
    2026-03-03

最新評論

黄龙县| 河北省| 常宁市| 尼玛县| 龙陵县| 黑水县| 武宁县| 永和县| 宁海县| 定襄县| 舞钢市| 祁阳县| 聂拉木县| 南投县| 盐池县| 龙江县| 广丰县| 克拉玛依市| 尖扎县| 丹阳市| 鄂伦春自治旗| 都江堰市| 方正县| 张家川| 宁城县| 墨玉县| 绥江县| 兴安县| 突泉县| 普安县| 河源市| 梅州市| 武乡县| 田林县| 阜城县| 雅江县| 襄汾县| 兴业县| 和静县| 亳州市| 镇康县|