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

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 日常開發(fā)中的公共字段

在日常的開發(fā)過(guò)程中, DAO層的數(shù)據(jù)庫(kù)實(shí)體類(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)說(shuō),這些公共字段我們都會(huì)封裝在一個(gè) Super Entity 類中,所以在這個(gè)類中,我們把所有更新和插入時(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è)枚舉類,其中定義了四種處理方法:

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 中的 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 目前的邏輯刪除

日常開發(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中實(shí)現(xiàn)C#語(yǔ)法里的按引用傳遞參數(shù)的方法

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

    下面小編就為大家?guī)?lái)一篇在java中實(shí)現(xiàn)C#語(yǔ)法里的按引用傳遞參數(shù)的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-09-09
  • 如何理解Java線程池及其使用方法

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

    線程池是首先創(chuàng)建一些線程,它們的集合稱為線程池。使用線程池可以提高性能,它在系統(tǒng)啟動(dòng)時(shí)創(chuàng)建大量空閑的線程,程序?qū)⒁粋€(gè)任務(wù)傳給線程池,它就會(huì)啟動(dòng)一條線程來(lái)執(zhí)行這個(gè)任務(wù),執(zhí)行結(jié)束以后,該線程并不會(huì)死亡,而是再次返回線程池中成為空閑狀態(tài),等待執(zhí)行下一個(gè)任務(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芯片無(wú)法使用的問(wèn)題及解決

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

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

    Java教程各種接口的介紹

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

    struts2入門介紹及代碼實(shí)例

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

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

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

    Java反射的定義和用法詳解

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

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

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

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

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

最新評(píng)論

渑池县| 灵武市| 肃宁县| 新乡市| 洱源县| 松江区| 兴宁市| 永和县| 吉林省| 康保县| 准格尔旗| 石城县| 资源县| 科尔| 昌平区| 兴国县| 余江县| 临江市| 环江| 抚松县| 大港区| 平昌县| 郸城县| 吉首市| 都江堰市| 上林县| 自治县| 旬阳县| 白银市| 通渭县| 孟连| 彭泽县| 临海市| 奎屯市| 闵行区| 杂多县| 通江县| 乌拉特后旗| 元阳县| 凤城市| 桂阳县|