PageHelper.startPage()使用問題:自動添加多余的limit,以及利用PageInfo和Page手動分頁
問題描述
在工作中使用PageHelper.startPage()方法來讓mybait為我們自動設置分頁的pageNum,pageSize,但是有時候會出現自動為我們添加到了不需要分頁的查詢sql中,導致以下問題:
-
查詢報錯,提示如下信息,sql沒有問題,是自動添加了多余的LIMIT ?,並且只是偶然發生;
-
查詢的結果一頁應顯示10條,實則顯示5條;
使用規范
針對以上出現的情況,主要原因是.startPage()使用不當,參考相關說明文檔后,建議使用方法為:Mapper接口方式的調用,但是必須緊跟.startPage()方法;
PageHelper.startPage(1, 10);
List<Country> list = countryMapper.selectIf(1);
問題原因
底層主要是通過將pageNum,pageSize放入ThreadLocal,
protected static final ThreadLocal<Page> LOCAL_PAGE = new ThreadLocal<Page>();
但是在執行完.startPage()后,沒有查詢數據庫操作,並且此次查詢請求響應結束,線程空閑時,又有新的別的查詢請求進來,此時線程復用,mybaits通過自身的攔截器,導致給新的查詢自動添加了limit?,?,從而報錯
解決方案
因為項目中是查詢多次分類的結果后,需要對list進行分頁,此種情況,結合PageInfo和Page進行手動分頁,通過以下方法實現
/**
* pagehelper 手動分頁
* @param currentPage 當前頁
* @param pageSize
* @param list
* @param <T>
* @return
*/
public static <T> PageInfo<T> getPageInfo(int currentPage, int pageSize, List<T> list) {
int total = list.size();
if (total > pageSize) {
int toIndex = pageSize * currentPage;
if (toIndex > total) {
toIndex = total;
}
list = list.subList(pageSize * (currentPage - 1), toIndex);
}
Page<T> page = new Page<>(currentPage, pageSize);
page.addAll(list);
page.setPages((total + pageSize - 1) / pageSize);
page.setTotal(total);
PageInfo<T> pageInfo = new PageInfo<>(page);
return pageInfo;
}