Mybatis-plus分頁(yè)查詢不生效問(wèn)題排查全過(guò)程
一、問(wèn)題描述
在查詢的時(shí)候,發(fā)現(xiàn)點(diǎn)擊后臺(tái)的分頁(yè)器數(shù)字,第2頁(yè)時(shí)候,數(shù)據(jù)還是和第1頁(yè)的一致。就看后臺(tái)的數(shù)據(jù)庫(kù)打印語(yǔ)句,如下所示。點(diǎn)擊第一頁(yè)和第二頁(yè)都是這個(gè),limit后的參數(shù)只有一個(gè),前期做過(guò)類似,點(diǎn)擊第二頁(yè)分頁(yè)的時(shí)候,語(yǔ)句是LIMIT ?,?
ON ap.id = a.project_id ORDER BY a.create_time DESC LIMIT ?
二、分析步驟
1.首先開始懷疑的是自己的分頁(yè)對(duì)象出現(xiàn)了問(wèn)題,因?yàn)镸ySQL ORM框架使用了JPA框架遺留的代碼。將spring-data
的分頁(yè)對(duì)象org.springframework.data.domain.Pageable
轉(zhuǎn)成了mybatis-plus
的分頁(yè)對(duì)象com.baomidou.mybatisplus.extension.plugins.pagination.Page<T>
。
debug后,Page<T>
的 current 和 size 都是存在且對(duì)應(yīng)前臺(tái)傳來(lái)的值。
2.接著懷疑是mybatis-plus
的攔截器順序問(wèn)題,因?yàn)轫?xiàng)目里寫了數(shù)據(jù)權(quán)限的攔截器,在研究數(shù)據(jù)權(quán)限攔截器的時(shí)候就看到有說(shuō)攔截器添加順序會(huì)影響到SQL語(yǔ)句拼接的正確性。對(duì)比了正常的添加順序后,這部分也沒(méi)有問(wèn)題。
@Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); //添加數(shù)據(jù)權(quán)限處理器,注意順序,先數(shù)據(jù)權(quán)限再分頁(yè) 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)這兩部分都沒(méi)問(wèn)題后,決定還是debug一下分頁(yè)攔截器。
重要的分頁(yè)SQL語(yǔ)句拼接函數(shù)如下。
DialectModel model = dialect.buildPaginationSql(buildSql, page.offset(), page.getSize());
進(jìn)入到里面,這里數(shù)據(jù)庫(kù)使用的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é)果來(lái)看,current 是正常傳值的。
default long offset() { long current = this.getCurrent(); return current <= 1L ? 0L : Math.max((current - 1L) * this.getSize(), 0L); }
因此到這里我們就會(huì)發(fā)現(xiàn),是offset
的真實(shí)值不正確。
當(dāng)后臺(tái)前端頁(yè)面?zhèn)鱽?lái)的current
是0
時(shí),offset
等于0
。
當(dāng)后臺(tái)前端頁(yè)面?zhèn)鱽?lái)的current
是1
時(shí),offset
依舊等于0
。
而回到拼接函數(shù)buildPaginationSql
中,不等于0的時(shí)候才會(huì)有 兩個(gè)參數(shù)的拼接。
至此,這個(gè)問(wèn)題解決了,就是在對(duì)象轉(zhuǎn)換時(shí),沒(méi)有對(duì)current
的值進(jìn)行 + 1
三、解決方案
public class MyPage<T> extends Page<T> { /** * @Description: 將spring的分頁(yè)對(duì)象轉(zhuǎn)成Mybatis * @param pageable: * @return: null **/ public MyPage(Pageable pageable) { this.setSize(pageable.getPageSize()); this.setCurrent(pageable.getPageNumber() + 1); } }
四、總結(jié)
- 多用編譯器的debug
- 細(xì)節(jié)問(wèn)題還是要注意,哪怕一個(gè)變量
到此這篇關(guān)于Mybatis-plus分頁(yè)查詢不生效問(wèn)題排查的文章就介紹到這了,更多相關(guān)Mybatis-plus分頁(yè)查詢不生效內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- mybatis-plus分頁(yè)查詢的實(shí)現(xiàn)實(shí)例
- SpringBoot使用mybatis-plus分頁(yè)查詢無(wú)效的問(wèn)題解決
- SpringBoot整合mybatis-plus實(shí)現(xiàn)分頁(yè)查詢功能
- mybatis-plus多表分頁(yè)查詢最佳實(shí)現(xiàn)方法(非常簡(jiǎn)單)
- mybatis-plus分頁(yè)查詢?nèi)N方法小結(jié)
- 如何使用mybatis-plus實(shí)現(xiàn)分頁(yè)查詢功能
- 一文搞懂Mybatis-plus的分頁(yè)查詢操作
- MyBatis-Plus?分頁(yè)查詢的實(shí)現(xiàn)示例
- springboot整合mybatis-plus 實(shí)現(xiàn)分頁(yè)查詢功能
- mybatis-plus分頁(yè)查詢的實(shí)現(xiàn)示例
- mybatis-plus 實(shí)現(xiàn)分頁(yè)查詢的示例代碼
相關(guān)文章
IDEA2020.3創(chuàng)建web工程的完整步驟
這篇文章主要給大家介紹了關(guān)于IDEA2020.3創(chuàng)建web工程的完整步驟,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01ssm框架下web項(xiàng)目,web.xml配置文件的作用(詳解)
下面小編就為大家?guī)?lái)一篇ssm框架下web項(xiàng)目,web.xml配置文件的作用(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10Java設(shè)計(jì)模式之訪問(wèn)者模式使用場(chǎng)景及代碼示例
這篇文章主要介紹了Java設(shè)計(jì)模式之訪問(wèn)者模式使用場(chǎng)景及代碼示例,小編覺得還是挺不錯(cuò)的,這里分享給大家,供需要的朋友參考。2017-11-11SpringBoot?項(xiàng)目瘦身maven/gradle詳解
這篇文章主要介紹了SpringBoot項(xiàng)目瘦身(maven/gradle),本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-01-01關(guān)于Mybatis使用collection分頁(yè)問(wèn)題
項(xiàng)目中mybatis分頁(yè)的場(chǎng)景是非常高頻的,當(dāng)使用ResultMap并配置collection做分頁(yè)的時(shí)候,我們可能會(huì)遇到獲取當(dāng)前頁(yè)的數(shù)據(jù)少于每頁(yè)大小的數(shù)據(jù)問(wèn)題。接下來(lái)通過(guò)本文給大家介紹Mybatis使用collection分頁(yè)問(wèn)題,感興趣的朋友一起看看吧2021-11-11