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

MyBatis-Plus 插件擴(kuò)展的實(shí)現(xiàn)

 更新時(shí)間:2024年09月25日 09:26:27   作者:Flying_Fish_Xuan  
MyBatis-Plus通過(guò)插件擴(kuò)展機(jī)制增強(qiáng)功能,基于MyBatis Interceptor攔截器,包括分頁(yè)插件、邏輯刪除、SQL性能分析和樂(lè)觀鎖等,開(kāi)發(fā)者可自定義插件以適應(yīng)特定需求,有效地增強(qiáng)SQL執(zhí)行過(guò)程的控制和優(yōu)化,同時(shí)注意插件使用的性能影響和執(zhí)行順序

MyBatis-Plus 提供了豐富的插件擴(kuò)展機(jī)制,允許開(kāi)發(fā)者通過(guò)插件實(shí)現(xiàn)增強(qiáng)功能或定制化操作。通過(guò)插件機(jī)制,開(kāi)發(fā)者可以輕松擴(kuò)展 MyBatis-Plus 的功能,從而滿足復(fù)雜的業(yè)務(wù)需求。

一、MyBatis-Plus 插件的工作原理

MyBatis-Plus 的插件機(jī)制基于 MyBatis 提供的 Interceptor 攔截器。MyBatis 攔截器可以對(duì) MyBatis 的四大核心對(duì)象進(jìn)行攔截和增強(qiáng)操作:

  • Executor:負(fù)責(zé)執(zhí)行 SQL 語(yǔ)句,如增刪改查等操作。
  • StatementHandler:負(fù)責(zé)處理 SQL 語(yǔ)句的生成和參數(shù)設(shè)置。
  • ResultSetHandler:負(fù)責(zé)處理 SQL 語(yǔ)句執(zhí)行后的結(jié)果集。
  • ParameterHandler:負(fù)責(zé)處理 SQL 語(yǔ)句中的參數(shù)綁定。

MyBatis-Plus 的插件機(jī)制是在 MyBatis 攔截器的基礎(chǔ)上擴(kuò)展的。通過(guò)插件,開(kāi)發(fā)者可以對(duì) SQL 執(zhí)行過(guò)程進(jìn)行攔截、修改和優(yōu)化。

二、MyBatis-Plus 常用插件

MyBatis-Plus 提供了許多內(nèi)置的插件,幫助開(kāi)發(fā)者快速實(shí)現(xiàn)常見(jiàn)的功能需求。

1. 分頁(yè)插件

分頁(yè)查詢是數(shù)據(jù)庫(kù)操作中常見(jiàn)的需求。MyBatis-Plus 提供了分頁(yè)插件,自動(dòng)為分頁(yè)查詢生成分頁(yè) SQL,避免手寫(xiě)分頁(yè)邏輯。

配置分頁(yè)插件:

在 MyBatisPlusConfig 中配置分頁(yè)插件:

@Configuration
public class MyBatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 配置分頁(yè)插件
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

分頁(yè)查詢代碼示例:

Page<User> page = new Page<>(1, 10);  // 第1頁(yè),每頁(yè)10條
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.ge(User::getAge, 18);
Page<User> userPage = userMapper.selectPage(page, queryWrapper);

selectPage 會(huì)根據(jù)分頁(yè)插件生成的分頁(yè) SQL 查詢數(shù)據(jù),返回結(jié)果包含分頁(yè)的詳細(xì)信息,如總條數(shù)、總頁(yè)數(shù)等。

2. 邏輯刪除插件

邏輯刪除允許在不刪除數(shù)據(jù)庫(kù)記錄的情況下標(biāo)記記錄為已刪除。MyBatis-Plus 提供了內(nèi)置的邏輯刪除支持,通過(guò)簡(jiǎn)單的配置即可實(shí)現(xiàn)。

配置邏輯刪除插件:

首先,在實(shí)體類中定義邏輯刪除字段,并使用 @TableLogic 注解標(biāo)記:

@Data
public class User {
    private Long id;
    private String name;
    private Integer age;

    // 邏輯刪除字段
    @TableLogic
    private Integer deleted;
}

在 application.yml 中配置邏輯刪除:

mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: deleted  # 設(shè)置邏輯刪除字段

當(dāng)調(diào)用 deleteById 方法時(shí),MyBatis-Plus 不會(huì)真正刪除數(shù)據(jù),而是將 deleted 字段設(shè)置為 1:

userMapper.deleteById(1L);  // 實(shí)際執(zhí)行:UPDATE user SET deleted = 1 WHERE id = 1

同時(shí),查詢時(shí) MyBatis-Plus 會(huì)自動(dòng)過(guò)濾已邏輯刪除的記錄。

3. SQL 性能分析插件

SQL 性能分析插件用于開(kāi)發(fā)環(huán)境中分析 SQL 的執(zhí)行性能,幫助開(kāi)發(fā)者優(yōu)化 SQL 查詢。

配置 SQL 性能分析插件:

@Configuration
public class MyBatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 配置性能分析插件
        interceptor.addInnerInterceptor(new PerformanceInnerInterceptor());
        return interceptor;
    }
}

啟用后,SQL 性能分析插件會(huì)在控制臺(tái)輸出每次 SQL 執(zhí)行的時(shí)間,方便開(kāi)發(fā)者優(yōu)化查詢性能。

4. 樂(lè)觀鎖插件

樂(lè)觀鎖用于解決并發(fā)問(wèn)題,MyBatis-Plus 提供了內(nèi)置的樂(lè)觀鎖插件,通過(guò)版本號(hào)控制數(shù)據(jù)的更新。

配置樂(lè)觀鎖插件:

在實(shí)體類中定義版本號(hào)字段,并使用 @Version 注解:

@Data
public class User {
    private Long id;
    private String name;
    private Integer age;

    @Version
    private Integer version;
}

在配置類中注冊(cè)樂(lè)觀鎖插件:

@Configuration
public class MyBatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 配置樂(lè)觀鎖插件
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return interceptor;
    }
}

更新操作時(shí),MyBatis-Plus 會(huì)自動(dòng)檢查版本號(hào),確保并發(fā)時(shí)數(shù)據(jù)不會(huì)被覆蓋。

三、自定義插件

除了使用 MyBatis-Plus 提供的內(nèi)置插件,開(kāi)發(fā)者還可以根據(jù)自己的業(yè)務(wù)需求,編寫(xiě)自定義插件。自定義插件可以攔截 MyBatis 執(zhí)行過(guò)程中的 SQL 語(yǔ)句或操作邏輯,進(jìn)行功能增強(qiáng)。

1. 自定義插件步驟

自定義插件通常需要以下幾個(gè)步驟:

  • 實(shí)現(xiàn) Interceptor 接口:定義一個(gè)類實(shí)現(xiàn) MyBatis 的 Interceptor 接口,覆蓋 intercept() 方法,編寫(xiě)攔截邏輯。
  • 注冊(cè)插件:將自定義插件注冊(cè)到 MyBatis-Plus 中。

2. 自定義插件示例

下面我們實(shí)現(xiàn)一個(gè)簡(jiǎn)單的自定義插件,用于在 SQL 執(zhí)行前輸出 SQL 語(yǔ)句到控制臺(tái)。

public class MyCustomInterceptor implements Interceptor {

    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        // 獲取執(zhí)行的 SQL 語(yǔ)句
        Object[] args = invocation.getArgs();
        MappedStatement mappedStatement = (MappedStatement) args[0];
        BoundSql boundSql = mappedStatement.getBoundSql(args[1]);
        String sql = boundSql.getSql();
        System.out.println("執(zhí)行的 SQL: " + sql);

        // 執(zhí)行原始操作
        return invocation.proceed();
    }

    @Override
    public Object plugin(Object target) {
        return Plugin.wrap(target, this);
    }

    @Override
    public void setProperties(Properties properties) {
    }
}

3. 注冊(cè)自定義插件

將自定義插件注冊(cè)到 MyBatis-Plus 配置中:

@Configuration
public class MyBatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 注冊(cè)自定義插件
        interceptor.addInnerInterceptor(new MyCustomInterceptor());
        return interceptor;
    }
}

運(yùn)行應(yīng)用程序后,每次執(zhí)行 SQL 語(yǔ)句時(shí),自定義插件都會(huì)攔截并輸出 SQL 到控制臺(tái)。

四、插件擴(kuò)展注意事項(xiàng)

  • 插件順序:MyBatis-Plus 支持多個(gè)插件,多個(gè)插件會(huì)按照注冊(cè)的順序依次執(zhí)行。開(kāi)發(fā)者在編寫(xiě)自定義插件時(shí),應(yīng)注意插件的執(zhí)行順序,以避免插件之間的沖突。

  • 性能影響:雖然插件可以增強(qiáng) MyBatis-Plus 的功能,但過(guò)多的插件可能會(huì)對(duì)性能產(chǎn)生影響,特別是在高并發(fā)場(chǎng)景中,應(yīng)避免不必要的插件使用。

  • 使用場(chǎng)景:MyBatis-Plus 的插件機(jī)制適用于多種場(chǎng)景,開(kāi)發(fā)者可以根據(jù)業(yè)務(wù)需求選擇合適的插件,或自定義插件來(lái)增強(qiáng) MyBatis-Plus 的功能。但要注意的是,插件主要適用于 SQL 執(zhí)行相關(guān)的功能擴(kuò)展,對(duì)于復(fù)雜的業(yè)務(wù)邏輯處理,應(yīng)在業(yè)務(wù)層進(jìn)行。

五、總結(jié)

MyBatis-Plus 提供了強(qiáng)大的插件擴(kuò)展機(jī)制,通過(guò)插件可以輕松實(shí)現(xiàn)分頁(yè)、邏輯刪除、SQL 性能分析、樂(lè)觀鎖等常見(jiàn)功能。MyBatis-Plus 內(nèi)置的插件已經(jīng)覆蓋了大多數(shù)開(kāi)發(fā)需求,開(kāi)發(fā)者只需要簡(jiǎn)單配置即可使用。如果有特殊的業(yè)務(wù)需求,開(kāi)發(fā)者還可以通過(guò)實(shí)現(xiàn)自定義插件對(duì) MyBatis-Plus 的 SQL 執(zhí)行過(guò)程進(jìn)行干預(yù)和擴(kuò)展。

到此這篇關(guān)于MyBatis-Plus 插件擴(kuò)展的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)MyBatis-Plus 插件擴(kuò)展內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JAVA String.valueOf()方法的用法說(shuō)明

    JAVA String.valueOf()方法的用法說(shuō)明

    這篇文章主要介紹了JAVA String.valueOf()方法的用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • 詳談@Cacheable不起作用的原因:bean未序列化問(wèn)題

    詳談@Cacheable不起作用的原因:bean未序列化問(wèn)題

    這篇文章主要介紹了@Cacheable不起作用的原因:bean未序列化問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Spring Security學(xué)習(xí)筆記(一)

    Spring Security學(xué)習(xí)筆記(一)

    這篇文章主要介紹了Spring Security的相關(guān)資料,幫助大家開(kāi)始學(xué)習(xí)Spring Security框架,感興趣的朋友可以了解下
    2020-09-09
  • 使用lombok的@Data會(huì)導(dǎo)致棧溢出StackOverflowError問(wèn)題

    使用lombok的@Data會(huì)導(dǎo)致棧溢出StackOverflowError問(wèn)題

    這篇文章主要介紹了使用lombok的@Data會(huì)導(dǎo)致棧溢出StackOverflowError問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • JetBrains推出全新IDE之Fleet詳解

    JetBrains推出全新IDE之Fleet詳解

    當(dāng)您第一次啟動(dòng) Fleet 時(shí),它會(huì)作為一個(gè)功能齊全的編輯器啟動(dòng),具有語(yǔ)法高亮顯示、簡(jiǎn)單的代碼補(bǔ)全以及您對(duì)一個(gè)編輯器期待的所有功能,本文學(xué)習(xí)下JetBrains推出全新IDE之Fleet相關(guān)知識(shí),感興趣的朋友跟隨小編一起看看吧
    2021-12-12
  • Java異常捕獲及處理方式詳解

    Java異常捕獲及處理方式詳解

    異常處理是Java編程中非常重要的一部分,它允許我們?cè)诔绦蜻\(yùn)行時(shí)捕獲并處理錯(cuò)誤或不預(yù)期的行為,而不是讓程序直接崩潰,本文將介紹Java中如何捕獲異常,以及常用的異常處理方式,需要的朋友可以參考下
    2025-08-08
  • Java中處理金額計(jì)算之使用Long還是BigDecimal詳解

    Java中處理金額計(jì)算之使用Long還是BigDecimal詳解

    在Java后端開(kāi)發(fā)中處理與錢有關(guān)的業(yè)務(wù)時(shí),確保金額計(jì)算的準(zhǔn)確性和避免錯(cuò)誤非常重要,這篇文章主要給大家介紹了關(guān)于Java中處理金額計(jì)算之使用Long還是BigDecimal的相關(guān)資料,需要的朋友可以參考下
    2024-07-07
  • Spring?Boot與Redis的緩存一致性問(wèn)題解決

    Spring?Boot與Redis的緩存一致性問(wèn)題解決

    在使用緩存時(shí),緩存一致性問(wèn)題是一個(gè)常見(jiàn)的挑戰(zhàn),本文主要介紹了Spring?Boot與Redis的緩存一致性問(wèn)題,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-07-07
  • Logback 使用TurboFilter實(shí)現(xiàn)日志級(jí)別等內(nèi)容的動(dòng)態(tài)修改操作

    Logback 使用TurboFilter實(shí)現(xiàn)日志級(jí)別等內(nèi)容的動(dòng)態(tài)修改操作

    這篇文章主要介紹了Logback 使用TurboFilter實(shí)現(xiàn)日志級(jí)別等內(nèi)容的動(dòng)態(tài)修改操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • SpringCloud Feign隔離與降級(jí)詳細(xì)分析

    SpringCloud Feign隔離與降級(jí)詳細(xì)分析

    Feign是Netflix公司開(kāi)發(fā)的一個(gè)聲明式的REST調(diào)用客戶端; Ribbon負(fù)載均衡、 Hystrⅸ服務(wù)熔斷是我們Spring Cloud中進(jìn)行微服務(wù)開(kāi)發(fā)非?;A(chǔ)的組件,在使用的過(guò)程中我們也發(fā)現(xiàn)它們一般都是同時(shí)出現(xiàn)的,而且配置也都非常相似
    2022-11-11

最新評(píng)論

克拉玛依市| 江阴市| 饶阳县| 华容县| 修武县| 电白县| 那坡县| 荆州市| 盘山县| 娱乐| 京山县| 连城县| 夏邑县| 南靖县| 玛沁县| 沅江市| 汽车| 瑞安市| 枣强县| 平南县| 鸡泽县| 伊川县| 成安县| 柘荣县| 大英县| 红桥区| 灵川县| 通辽市| 安国市| 乐平市| 永州市| 丽水市| 偏关县| 徐汇区| 浪卡子县| 祁东县| 永年县| 林州市| 临颍县| 屏山县| 锦屏县|