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

SpringBoot使用Mybatis-Plus中分頁插件PaginationInterceptor詳解

 更新時間:2025年07月15日 09:49:44   作者:秋分的秋刀魚  
文章介紹SpringBoot高版本中使用MyBatisPlusInterceptor替代舊分頁插件,需配置多個InnerInterceptor功能模塊(如分頁、多租戶、動態(tài)表名等),并強(qiáng)調(diào)插件順序和mapper.xml中SQL語句不能以分號結(jié)尾,以避免分頁語法錯誤

1 配置分頁插件

@Configuration
public class MybatisConfig {
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }
}

在高版本的SpringBoot中, 會提示這種寫法已過時, 所以采用另一種寫法 MybatisPlusInterceptor , 如下:

@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
    MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.H2));
    return interceptor;
}

1.1 MybatisPlusInterceptor

該插件是核心插件,目前代理了 Executor#query 和 Executor#update 和 StatementHandler#prepare 方法

1.1.1 屬性

private List<InnerInterceptor> interceptors = new ArrayList<>();

1.1.2 InnerInterceptor

  • 我們提供的插件都將基于此接口來實現(xiàn)功能 目前已有的功能: 自動分頁: PaginationInnerInterceptor 多租戶:
  • TenantLineInnerInterceptor 動態(tài)表名: DynamicTableNameInnerInterceptor 樂觀鎖:
  • OptimisticLockerInnerInterceptor sql性能規(guī)范: IllegalSQLInnerInterceptor
  • 防止全表更新與刪除: BlockAttackInnerInterceptor 注意: 使用多個功能需要注意順序關(guān)系,建議使用如下順序 多租戶
  • 動態(tài)表名 分頁,樂觀鎖 sql性能規(guī)范,防止全表更新與刪除 總結(jié): 對sql進(jìn)行單次改造的優(yōu)先放入,不對sql進(jìn)行改造的最后放入

2 編寫Mapper及其對應(yīng)的mapper.xml文件

@Mapper
public interface UserMapper extends BaseMapper<User> {
    List<User> findPageUsers(Page<User> page);
}
<select id="findPageUsers" resultType="org.wxmx.mybatis_plus_study.entity.User">
    select *
    from `user`
</select>

3 編寫測試類

3.1 簡單的分頁查詢

@SpringBootTest
class MybatisPlusStudyApplicationTests {
    @Resource
    UserMapper userMapper;
    @Test
    void contextLoads() {
        Page<User> page = new Page<>(1, 3);
        List<User> pageUsers = userMapper.findPageUsers(page);
        page.setRecords(pageUsers);
        System.out.println(page);
    }
}

運行結(jié)果:

JsqlParserCountOptimize sql=select *
        from `user`
==>  Preparing: SELECT COUNT(1) FROM `user`
==> Parameters: 
<==    Columns: COUNT(1)
<==        Row: 9
==>  Preparing: select * from `user` LIMIT ?
==> Parameters: 3(Long)
<==    Columns: id, name, age
<==        Row: 39a773890a1b12b8a072c1be02ff3cdc, aaa, 12
<==        Row: 3b25fb904548c28b7ac6882d86c7ae5f, wdh, 12
<==        Row: 8b0397fcdfebe37d1d26175c17ed3725, wdh, 12
<==      Total: 3

3.2 帶查詢條件的分頁查詢

此方法是使用PaginationInterceptor 作為分頁插件.

@Test
void contextLoads() {
    Page<User> page = new Page<>(1, 2);
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.eq("name", "wdh");
    Page<User> page1 = userMapper.selectPage(page, queryWrapper);
   	page.setRecords(page1.getRecords()).getRecords().forEach(System.out::println);
}

運行結(jié)果:

JsqlParserCountOptimize sql=SELECT  id,name,age  FROM user 
 
 WHERE (name = ?)
==>  Preparing: SELECT COUNT(1) FROM user WHERE (name = ?)
==> Parameters: wdh(String)
<==    Columns: COUNT(1)
<==        Row: 5
==>  Preparing: SELECT id,name,age FROM user WHERE (name = ?) LIMIT ?
==> Parameters: wdh(String), 2(Long)
<==    Columns: id, name, age
<==        Row: 3b25fb904548c28b7ac6882d86c7ae5f, wdh, 12
<==        Row: 8b0397fcdfebe37d1d26175c17ed3725, wdh, 12
<==      Total: 2
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@6a0f2853]
User(id=3b25fb904548c28b7ac6882d86c7ae5f, name=wdh, age=12)
User(id=8b0397fcdfebe37d1d26175c17ed3725, name=wdh, age=12)

3.3 Page

簡單分頁模型, 有如下幾個主要屬性

/**
 * 查詢數(shù)據(jù)列表
 */
protected List<T> records = Collections.emptyList();

/**
 * 總數(shù)
 */
protected long total = 0;

/**
 * 每頁顯示條數(shù),默認(rèn) 10
 */
protected long size = 10;

/**
 * 當(dāng)前頁
 */
protected long current = 1;

4 注意事項

在編寫mapper.xml中的SQL語句的時候, 語句末尾不能使用 ; 結(jié)尾, 原因是在做分頁的時候會在編寫的SQL語句后面拼接上limit語句, 導(dǎo)致出現(xiàn)SQL語法錯誤(SQLSyntaxErrorException). 如下所示:

JsqlParserCountOptimize sql=select *
        from `user`;
==>  Preparing: SELECT COUNT(1) FROM `user`
==> Parameters: 
<==    Columns: COUNT(1)
<==        Row: 9
==>  Preparing: select * from `user`; LIMIT ?
==> Parameters: 3(Long)
org.springframework.jdbc.BadSqlGrammarException: 
### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LIMIT 3' at line 1
### The error may exist in org/wxmx/mybatis_plus_study/mapper/UserMapper.xml
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### SQL: select *         from `user`; LIMIT ?
### Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LIMIT 3' at line 1
; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: You have an error in your SQL 

總結(jié)

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

相關(guān)文章

  • java中使用interrupt通知線程停止詳析

    java中使用interrupt通知線程停止詳析

    這篇文章主要介紹了java中使用interrupt通知線程停止詳析,文章介紹的是使用interrupt來通知線程停止運行,而不是強(qiáng)制停止,詳細(xì)內(nèi)容需要的小伙伴可以參考一下
    2022-09-09
  • java數(shù)據(jù)結(jié)構(gòu)之插入排序

    java數(shù)據(jù)結(jié)構(gòu)之插入排序

    這篇文章主要為大家詳細(xì)介紹了java數(shù)據(jù)結(jié)構(gòu)之插入排序的相關(guān)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • 深入理解Java中的棧從入門到精通(超詳細(xì))新手必看

    深入理解Java中的棧從入門到精通(超詳細(xì))新手必看

    本文詳細(xì)介紹Java中棧的知識,先闡述棧的概念與后進(jìn)先出特性,接著說明Java棧幀結(jié)構(gòu),還介紹了棧的應(yīng)用、基本方法,以及基于數(shù)組、鏈表、隊列等的實現(xiàn)方式,感興趣的朋友跟隨小編一起看看吧
    2025-10-10
  • springboot集成es詳解

    springboot集成es詳解

    這篇文章主要介紹了springboot集成es,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • Spring Boot的單例模式實現(xiàn)代碼

    Spring Boot的單例模式實現(xiàn)代碼

    Spring Boot里的單例不是GoF意義上的全JVM 唯一對象 + 私有構(gòu)造器,而是由 Spring 容器管理的每個 ApplicationContext 僅一個實例,本文介紹Spring Boot的單例模式是如何實現(xiàn)的,感興趣的朋友跟隨小編一起看看吧
    2026-03-03
  • DecimalFormat多種用法詳解

    DecimalFormat多種用法詳解

    這篇文章主要為大家詳細(xì)介紹了DecimalFormat的多種用法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • Java使用jdbc連接MySQL數(shù)據(jù)庫實例分析

    Java使用jdbc連接MySQL數(shù)據(jù)庫實例分析

    這篇文章主要介紹了Java使用jdbc連接MySQL數(shù)據(jù)庫,結(jié)合實例形式分析了Java基于jdbc鏈接mysql的相關(guān)配置及工具類的定義相關(guān)操作技巧,需要的朋友可以參考下
    2018-07-07
  • Java File類 mkdir 不能創(chuàng)建多層目錄的解決

    Java File類 mkdir 不能創(chuàng)建多層目錄的解決

    這篇文章主要介紹了Java File類 mkdir 不能創(chuàng)建多層目錄的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 如何通過Maven倉庫安裝Spire系列的Java產(chǎn)品

    如何通過Maven倉庫安裝Spire系列的Java產(chǎn)品

    這篇文章主要介紹了如何通過Maven倉庫安裝Spire系列的Java產(chǎn)品,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-07-07
  • java字符串的重要使用方法以及實例

    java字符串的重要使用方法以及實例

    在本篇文章里小編給大家整理了關(guān)于java字符串的重要使用方法以及實例代碼,需要的朋友們可以跟著學(xué)習(xí)參考下。
    2019-03-03

最新評論

北流市| 璧山县| 根河市| 九台市| 蛟河市| 新宾| 泸州市| 汝阳县| 米林县| 阜城县| 江西省| 汤阴县| 龙胜| 新乐市| 锡林浩特市| 淮南市| 杭州市| 张家港市| 柳林县| 裕民县| 峨眉山市| 资阳市| 南雄市| 钦州市| 龙海市| 黑龙江省| 静海县| 都匀市| 永新县| 宁武县| 会理县| 萝北县| 平罗县| 新乡市| 嘉祥县| 萝北县| 铁力市| 溧阳市| 凤凰县| 图木舒克市| 南召县|