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

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

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

1 配置分頁插件

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

在高版本的SpringBoot中, 會(huì)提示這種寫法已過時(shí), 所以采用另一種寫法 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

  • 我們提供的插件都將基于此接口來實(shí)現(xiàn)功能 目前已有的功能: 自動(dòng)分頁: PaginationInnerInterceptor 多租戶:
  • TenantLineInnerInterceptor 動(dòng)態(tài)表名: DynamicTableNameInnerInterceptor 樂觀鎖:
  • OptimisticLockerInnerInterceptor sql性能規(guī)范: IllegalSQLInnerInterceptor
  • 防止全表更新與刪除: BlockAttackInnerInterceptor 注意: 使用多個(gè)功能需要注意順序關(guān)系,建議使用如下順序 多租戶
  • 動(dòng)態(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);
    }
}

運(yùn)行結(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);
}

運(yùn)行結(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

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

/**
 * 查詢數(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 注意事項(xiàng)

在編寫mapper.xml中的SQL語句的時(shí)候, 語句末尾不能使用 ; 結(jié)尾, 原因是在做分頁的時(shí)候會(huì)在編寫的SQL語句后面拼接上limit語句, 導(dǎo)致出現(xiàn)SQL語法錯(cuò)誤(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é)

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

相關(guān)文章

  • 基于SpringBoot和Vue實(shí)現(xiàn)頭像上傳與回顯功能

    基于SpringBoot和Vue實(shí)現(xiàn)頭像上傳與回顯功能

    在現(xiàn)代Web應(yīng)用中,用戶個(gè)性化體驗(yàn)尤為重要,其中頭像上傳與回顯是一個(gè)常見的功能需求,本文將詳細(xì)介紹如何使用Spring Boot和Vue.js構(gòu)建一個(gè)前后端協(xié)同工作的頭像上傳系統(tǒng),并實(shí)現(xiàn)圖片的即時(shí)回顯,需要的朋友可以參考下
    2024-08-08
  • Spring Boot security 默認(rèn)攔截靜態(tài)資源的解決方法

    Spring Boot security 默認(rèn)攔截靜態(tài)資源的解決方法

    這篇文章主要介紹了Spring Boot security 默認(rèn)攔截靜態(tài)資源,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • Springboot整合SpringSecurity的完整案例詳解

    Springboot整合SpringSecurity的完整案例詳解

    Spring Security是基于Spring生態(tài)圈的,用于提供安全訪問控制解決方案的框架,Spring Security登錄認(rèn)證主要涉及兩個(gè)重要的接口 UserDetailService和UserDetails接口,本文對Springboot整合SpringSecurity過程給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2024-01-01
  • 解決spirngboot連接redis報(bào)錯(cuò):READONLY?You?can‘t?write?against?a?read?only?replica的問題

    解決spirngboot連接redis報(bào)錯(cuò):READONLY?You?can‘t?write?against?

    docker部署的redis,springboot基本每天來連redis都報(bào)錯(cuò):READONLY?You?can't?write?against?a?read?only?replica,重啟redis后,可以正常連接。但是每天都重啟redis,不現(xiàn)實(shí),也很麻煩,今天給大家分享解決方式,感興趣的朋友一起看看吧
    2023-06-06
  • 舉例講解JDK注解的使用和自定義注解的方法

    舉例講解JDK注解的使用和自定義注解的方法

    今天小編就為大家分享一篇關(guān)于舉例講解JDK注解的使用和自定義注解的方法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • 解決RestTemplate 請求url中包含百分號 會(huì)被轉(zhuǎn)義成25的問題

    解決RestTemplate 請求url中包含百分號 會(huì)被轉(zhuǎn)義成25的問題

    這篇文章主要介紹了解決RestTemplate 請求url中包含百分號 會(huì)被轉(zhuǎn)義成25的問題,具有很好的參考價(jià)值,希望對大家有所幫助。
    2021-10-10
  • SpringBoot靜態(tài)資源及原理解析

    SpringBoot靜態(tài)資源及原理解析

    這篇文章主要介紹了SpringBoot靜態(tài)資源及原理解析,當(dāng)創(chuàng)建一個(gè)jar工程時(shí),想引入css等靜態(tài)資源時(shí),需要遵守SpringBoot的靜態(tài)資源映射關(guān)系,通過WebMvcAutoConfiguration查看靜態(tài)配置資源的規(guī)則,需要的朋友可以參考下
    2023-12-12
  • Java 畫時(shí)鐘遇到的問題及解決方案

    Java 畫時(shí)鐘遇到的問題及解決方案

    我是一個(gè)剛?cè)腴T的小菜鳥,希望我寫的東西可以幫助和我一樣剛?cè)腴T的兄弟們少走一些彎路,也希望大佬們可以多指點(diǎn)指點(diǎn)我。感謝!解決在畫時(shí)鐘遇到的問題讓我花費(fèi)不少時(shí)間...說兩個(gè)困擾我比較久的
    2021-11-11
  • Java任意長度byte數(shù)組轉(zhuǎn)換為int數(shù)組的方法

    Java任意長度byte數(shù)組轉(zhuǎn)換為int數(shù)組的方法

    這篇文章主要給大家介紹了關(guān)于Java任意長度byte數(shù)組轉(zhuǎn)換為int數(shù)組的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Java實(shí)現(xiàn)SMS短信通發(fā)送手機(jī)驗(yàn)證碼案例講解

    Java實(shí)現(xiàn)SMS短信通發(fā)送手機(jī)驗(yàn)證碼案例講解

    這篇文章主要介紹了Java實(shí)現(xiàn)SMS短信通發(fā)送手機(jī)驗(yàn)證碼案例講解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08

最新評論