Mybatis-plus分頁查詢不生效問題排查全過程
一、問題描述
在查詢的時候,發(fā)現(xiàn)點擊后臺的分頁器數(shù)字,第2頁時候,數(shù)據(jù)還是和第1頁的一致。就看后臺的數(shù)據(jù)庫打印語句,如下所示。點擊第一頁和第二頁都是這個,limit后的參數(shù)只有一個,前期做過類似,點擊第二頁分頁的時候,語句是LIMIT ?,?
ON ap.id = a.project_id ORDER BY a.create_time DESC LIMIT ?
二、分析步驟
1.首先開始懷疑的是自己的分頁對象出現(xiàn)了問題,因為MySQL ORM框架使用了JPA框架遺留的代碼。將spring-data的分頁對象org.springframework.data.domain.Pageable轉(zhuǎn)成了mybatis-plus的分頁對象com.baomidou.mybatisplus.extension.plugins.pagination.Page<T>。
debug后,Page<T>的 current 和 size 都是存在且對應前臺傳來的值。
2.接著懷疑是mybatis-plus的攔截器順序問題,因為項目里寫了數(shù)據(jù)權(quán)限的攔截器,在研究數(shù)據(jù)權(quán)限攔截器的時候就看到有說攔截器添加順序會影響到SQL語句拼接的正確性。對比了正常的添加順序后,這部分也沒有問題。
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//添加數(shù)據(jù)權(quán)限處理器,注意順序,先數(shù)據(jù)權(quán)限再分頁
MyDataPermissionInterceptor dataPermissionInterceptor = new MyDataPermissionInterceptor();
// 添加自定義的數(shù)據(jù)權(quán)限處理器
dataPermissionInterceptor.setDataPermissionHandler(new MyDataPermissionHandler());
interceptor.addInnerInterceptor(dataPermissionInterceptor);
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return interceptor;
}
3.發(fā)現(xiàn)這兩部分都沒問題后,決定還是debug一下分頁攔截器。
重要的分頁SQL語句拼接函數(shù)如下。
DialectModel model = dialect.buildPaginationSql(buildSql, page.offset(), page.getSize());
進入到里面,這里數(shù)據(jù)庫使用的MySQL。
public class MySqlDialect implements IDialect {
@Override
public DialectModel buildPaginationSql(String originalSql, long offset, long limit) {
StringBuilder sql = new StringBuilder(originalSql).append(" LIMIT ").append(FIRST_MARK);
if (offset != 0L) {
sql.append(StringPool.COMMA).append(SECOND_MARK);
return new DialectModel(sql.toString(), offset, limit).setConsumerChain();
} else {
return new DialectModel(sql.toString(), limit).setConsumer(true);
}
}
}
可以看到偏移量offset至關(guān)重要,決定了拼接的條件判斷。
又發(fā)現(xiàn),offet的值和current相關(guān),根據(jù)排查結(jié)果來看,current 是正常傳值的。
default long offset() {
long current = this.getCurrent();
return current <= 1L ? 0L : Math.max((current - 1L) * this.getSize(), 0L);
}
因此到這里我們就會發(fā)現(xiàn),是offset的真實值不正確。
當后臺前端頁面?zhèn)鱽淼?code>current 是0時,offset等于0。
當后臺前端頁面?zhèn)鱽淼?code>current 是1時,offset依舊等于0。
而回到拼接函數(shù)buildPaginationSql中,不等于0的時候才會有 兩個參數(shù)的拼接。
至此,這個問題解決了,就是在對象轉(zhuǎn)換時,沒有對current的值進行 + 1
三、解決方案
public class MyPage<T> extends Page<T> {
/**
* @Description: 將spring的分頁對象轉(zhuǎn)成Mybatis
* @param pageable:
* @return: null
**/
public MyPage(Pageable pageable) {
this.setSize(pageable.getPageSize());
this.setCurrent(pageable.getPageNumber() + 1);
}
}
四、總結(jié)
- 多用編譯器的debug
- 細節(jié)問題還是要注意,哪怕一個變量
到此這篇關(guān)于Mybatis-plus分頁查詢不生效問題排查的文章就介紹到這了,更多相關(guān)Mybatis-plus分頁查詢不生效內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- mybatis-plus分頁查詢的實現(xiàn)實例
- SpringBoot使用mybatis-plus分頁查詢無效的問題解決
- SpringBoot整合mybatis-plus實現(xiàn)分頁查詢功能
- mybatis-plus多表分頁查詢最佳實現(xiàn)方法(非常簡單)
- mybatis-plus分頁查詢?nèi)N方法小結(jié)
- 如何使用mybatis-plus實現(xiàn)分頁查詢功能
- 一文搞懂Mybatis-plus的分頁查詢操作
- MyBatis-Plus?分頁查詢的實現(xiàn)示例
- springboot整合mybatis-plus 實現(xiàn)分頁查詢功能
- mybatis-plus分頁查詢的實現(xiàn)示例
- mybatis-plus 實現(xiàn)分頁查詢的示例代碼
相關(guān)文章
自帶IDEA插件的阿里開源診斷神器Arthas線上項目BUG調(diào)試
這篇文章主要為大家介紹了自帶IDEA插件阿里開源診斷神器Arthas線上項目BUG調(diào)試,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-06-06
Java8時間轉(zhuǎn)換(LocalDateTime)代碼實例
這篇文章主要介紹了java8時間轉(zhuǎn)換(LocalDateTime)代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-11-11
基于springMvc+hibernate的web application的構(gòu)建
下面小編就為大家?guī)硪黄趕pringMvc+hibernate的web application的構(gòu)建。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10
Spring Cloud根據(jù)服務名獲取服務的ip端口問題
這篇文章主要介紹了Spring Cloud根據(jù)服務名獲取服務的ip端口,本篇示例我就以Nacos注冊中心為例了,下面是我注冊的兩個服務,需要的朋友可以參考下2022-09-09
springboot中設(shè)置定時任務的三種方法小結(jié)
在我們開發(fā)項目過程中,經(jīng)常需要定時任務來幫助我們來做一些內(nèi)容,本文介紹了springboot中設(shè)置定時任務的三種方法,主要包括@Scheduled注解,Quartz框架和xxl-job框架的實現(xiàn),感興趣的可以了解一下2023-12-12

