得嘞,分頁外掛 PageHelper 返回記錄總數 total 竟然出錯了!
問題描述
分頁返回的記錄總數 total 和每頁數量 pageSize 一致,資料庫統計的數量大於當前返回的總記錄數 total,以下是相關程式碼
問題分析
sql 錯誤導致返回資訊有誤?
檢查結果:經過資料執行日誌中生成的 sql,sql 正常並且資料總條數也正確
PageHelper 使用方式錯誤,導致資料錯誤
檢查結果:透過與專案中其他地方使用記錄的對比,使用方式正確
返回結果後有中間處理導致總數減少
檢查結果:網上有人遇到 對返回結果有型別轉化導致 total 錯誤的情況, 以此類推,發現當前程式碼雖沒有對返回結果進行型別轉換但是對 mapper 返回的結果更換了例項物件然後將更換後的物件包裝,
進一步檢視包裝成 PageInfo時原始碼並沒有關於 total 引數的處理,
PageInfo構造方法
public class PageInfo extends PageSerializable {
/**
- 包裝 Page 物件 *
- @param list page 結果
-
@param navigatePages 頁碼數量
*/
public PageInfo(List list, int navigatePages) {
super(list);
if (list instanceof Page) {
Page page = (Page) list;
this.pageNum = page.getPageNum();
this.pageSize = page.getPageSize();this.pages = page.getPages();
this.size = page.size();
//由於結果是>startRow 的,所以實際的需要 +1
if (this.size == 0) {
this.startRow = 0;
this.endRow = 0;
} else {
this.startRow = page.getStartRow() + 1;
//計算實際的 endRow(最後一頁的時候特殊)
this.endRow = this.startRow - 1 + this.size;
}
} else if (list instanceof Collection) {
this.pageNum = 1;
this.pageSize = list.size();this.pages = this.pageSize > 0 ? 1 : 0;
this.size = list.size();
this.startRow = 0;
this.endRow = list.size() > 0 ? list.size() - 1 : 0;
}
if (list instanceof Collection) {
this.navigatePages = navigatePages;
//計算導航頁
calcNavigatepageNums();
//計算前後頁,第一頁,最後一頁
calcPage();
//判斷頁面邊界
judgePageBoudary();
}
}
}
繼續檢視父類 PageSerializable,發現有關於 total 引數的處理,即 mapper 返回的 list 不是 Page 的例項時 total 會被設定為返回 list 的 size 大小
PageSerializable 構造方法
public PageSerializable(List list) {
this.list = list;
if(list instanceof Page){
this.total = ((Page) list).getTotal();
} else {
this.total = list.size();
}
}
進一步 debug,發現返回 list 確實不是 Page 類的例項,故推斷出這一結果是由於對 mapper 返回 list 結果更換了例項物件導致的,
再次確認 mapper 返回結果,是 Page 的例項
解決方案
使用 mapper 返回的物件直接構造 PageInfo 物件,並在此基礎上獲取分頁資訊
更正的程式碼如下:
最佳實踐
在使用 PageInfo pageInfo = new PageInfo<>(T); 構造 PageInfo 時直接使用 mapper 返回物件,不要進行型別轉換或轉存等操作,以免丟失資料。
相關文章
- springboot整合分頁外掛pageHelper 返回全部資料問題Spring Boot
- PageHelper 分頁外掛使用中的那些“坑”
- Mybatis第三方PageHelper分頁外掛原理MyBatis
- SpringBoot中分頁外掛PageHelper的使用Spring Boot
- SpringBoot中使用Mybatis-plus整合PageHelper分頁外掛踩坑Spring BootMyBatis
- pageHelper分頁外掛導致的查詢慢的問題最佳化
- mybatis generator外掛系列--分頁外掛MyBatis
- 【深入淺出MyBatis系列七】分頁外掛MyBatis
- PageHelper複雜分頁
- 今天研究了一下vue分頁外掛Vue
- myBatis分頁外掛配置MyBatis
- Laravel 頁面突然變得很慢 原因竟然是開啟了 sudosu 外掛Laravel
- jquery分頁外掛呼叫報錯的問題:$(.).pagination is not a functionjQueryFunction
- mybatis plus 新增分頁外掛MyBatis
- mybatisPlus分頁外掛的使用MyBatis
- jquery寫的ajax分頁外掛jQuery
- SpringBoot 整合Mybatis + PageHelper 實現分頁Spring BootMyBatis
- React 優秀外掛記錄React
- mybatis的三發外掛:分頁pagehelpMyBatis
- MybatisPlus的分頁外掛簡單使用MyBatis
- [外掛擴充套件]簡單的IP記錄外掛套件
- 使用mybatis分頁外掛展示首頁最新視訊MyBatis
- Mybatis 分頁:Pagehelper + 攔截器實現MyBatis
- [外掛擴充套件]返回頂部ReturnTop外掛套件
- pagehelper踩坑記之分頁亂套
- kPagination-純js實現分頁外掛JS
- 如何實現一個mybaits 分頁外掛AI
- electron 外掛系統設計記錄
- 手把手教你開發 MyBatis 分頁外掛MyBatis
- Mybatis分頁外掛只顯示第一頁的問題MyBatis
- SQL Server 怎麼在分頁獲取資料的同時獲取到總記錄數SQLServer
- 【記錄】SSH分頁查詢功能
- [外掛擴充套件]單頁管理外掛套件
- MySql先分組統計總記錄數,再獲取記錄數中的最大值MySql
- Spring-Boot整合通用PageHelper外掛遇到的問題Springboot
- 【記錄】如何造一個vite外掛(2)Vite
- 單頁管理外掛
- 原生 JS實現一個簡單分頁外掛JS