關(guān)鍵詞: Mybatis 插件 分頁
- 官網(wǎng):https://pagehelper.github.io/
- Java API 地址: https://apidoc.gitee.com/free/Mybatis_PageHelper/
常見問題匯總
官方常見問題匯總
1.PageHelper.startPage不起作用
- 只有緊跟在 PageHelper.startPage 方法后的第一個(gè) Mybatis 的查詢(Select)方法會(huì)被分頁
2.請不要配置多個(gè)分頁插件
- 請不要在系統(tǒng)中配置多個(gè)分頁插件(使用 Spring 時(shí),mybatis-config.xml 和 Spring<bean> 配置方式,請選擇其中一種,不要同時(shí)配置多個(gè)分頁插件)!
3.分頁插件不支持帶有 for update 語句的分頁
- 對于帶有 for update 的 sql,會(huì)拋出運(yùn)行時(shí)異常,對于這樣的 sql 建議手動(dòng)分頁,畢竟這樣的 sql 需要重視。
4.為什么不支持一對一和一對多結(jié)果映射的分頁查詢
- 在一對一和一對多時(shí),根據(jù)分頁條件查詢出 100 條數(shù)據(jù)時(shí),由于一對一和一對多會(huì)去重,經(jīng)過嵌套處理后數(shù)據(jù)量會(huì)減少,因此分頁想要獲得 100 條數(shù)據(jù)無法實(shí)現(xiàn)。想要支持這種情況可以使用嵌套查詢。嵌套查詢是要額外執(zhí)行SQL,主SQL可以得到正確的結(jié)果數(shù)量,因此可以正常分頁。
配置參數(shù)使用
- 需要使用PageInfo類時(shí),需要設(shè)置配置參數(shù) rowBoundsWithCount 為 true,此時(shí)會(huì)在分頁時(shí)進(jìn)行count查詢
- 當(dāng)設(shè)置 offsetAsPageNum 為 true 時(shí),可以在查詢時(shí)使用pageNum,pageSize代替原有參數(shù) offset,limit 便于理解
- 當(dāng)設(shè)置 pageSizeZero 為 true 后,傳入的 pageSize=0 或者 RowBounds.limit = 0 就會(huì)查詢出全部的結(jié)果
- 當(dāng)用戶輸入?yún)?shù)不合法時(shí),希望得到邊界頁數(shù)時(shí)需要設(shè)置合理化參數(shù) reasonable 為 true
推薦使用方式
//獲取第1頁,10條內(nèi)容,默認(rèn)查詢總數(shù)count
PageHelper.startPage(1, 10);
List<Country> list = countryMapper.selectIf(1);
//用PageInfo對結(jié)果進(jìn)行包裝
PageInfo page = new PageInfo(list);
避免不安全的分頁
PageHelper 方法使用了靜態(tài)的 ThreadLocal 參數(shù),分頁參數(shù)和線程是綁定的
只要你可以保證在 PageHelper 方法調(diào)用后緊跟 MyBatis 查詢方法,這就是安全的。因?yàn)?PageHelper 在 finally 代碼段中自動(dòng)清除了 ThreadLocal 存儲(chǔ)的對象。
如果代碼在進(jìn)入 Executor 前發(fā)生異常,就會(huì)導(dǎo)致線程不可用,這屬于人為的 Bug(例如接口方法和 XML 中的不匹配,導(dǎo)致找不到 MappedStatement 時(shí)), 這種情況由于線程不可用,也不會(huì)導(dǎo)致 ThreadLocal 參數(shù)被錯(cuò)誤的使用。
如果PageHelper 生產(chǎn)了一個(gè)分頁參數(shù),但是沒有被消費(fèi),這個(gè)參數(shù)就會(huì)一直保留在這個(gè)線程上。當(dāng)這個(gè)線程再次被使用時(shí),就可能導(dǎo)致不該分頁的方法去消費(fèi)這個(gè)分頁參數(shù),這就產(chǎn)生了莫名其妙的分頁。
一點(diǎn)建議
- 1.一般前端傳過來的pageNum 和 pageSize 建議有一個(gè)初始化的默認(rèn)值(如1,10),這樣即使前端忘記傳遞相應(yīng)的值也不至于頁面卡死。若前端想獲取所有值時(shí),可以放開pageSizeZero 參數(shù) 后傳遞 pageSize=0
- 2.前端分頁一般都要求傳遞結(jié)果總數(shù),因此一般情況下會(huì)將 rowBoundsWithCount 參數(shù)放開
- 3.若非必須,不建議將 reasonable 參數(shù)放開,一方面有違邏輯常識,另一方面可能難以發(fā)覺和定位隱藏的問題