Java:手動實現PageHelper分頁功能
很多時候,頁面都需要用到分頁功能,一般情況下,直接調用 PageHelper.startPage(pageNum,pageSize) ,然後執行我們的sql查詢,再執行 PageInfo<類> pageInfo = new PageInfo<類>(list); 就可以將查詢結果分頁展示了,不需要我們人為干預。但是,在某個複雜情況下,我們無法通過單個sql查詢,直接得到我們想要的結果,或者說,通過單個sql查詢的效率太低。那麼,有沒有什麼方法,可以自己實現想要的分頁功能呢?
分頁功能,真正起作用的是PageInfo 對象。在PageInfo當中,設定了我們分頁所需要的一些參數,如總的頁數、第一頁、下一頁、前一頁 以及包含的頁碼,當前行和總行數。所以,通過設定這些參數,我們就可以根據我們的需要手動實現的分頁。具體代碼如下:
Advertisements
public static PageInfo getPageInfo(final List<CooperCom> list, final Integer pageNum , final Integer pageSize,final Integer recordsNum ){
//Integer recordsNum = list.size();
Integer totalPages = (recordsNum + pageSize -1)/ pageSize; // 總的頁面數
Integer nextPage = pageNum < totalPages?pageNum + 1:pageNum; // 下一頁的頁碼
Advertisements
Integer endIndex = pageNum * pageSize > recordsNum ? recordsNum : pageNum * pageSize; // 最後一行記錄的編號
PageInfo<CooperCom> pageInfo = new PageInfo<CooperCom>(list);
int[] pageNums = new int[totalPages];
for(int i = 0;i < recordsNum/pageSize;i++){
pageNums[i] = i + 1;
}
int prePageNum = pageNum > 1 ? pageNum - 1 : 1; // 設置前一頁的頁碼,噹噹前頁為第一頁的時候,前一頁仍然為第一頁
pageInfo.setNavigatepageNums(pageNums); // 設置頁碼集合
pageInfo.setStartRow((pageNum - 1) * pageSize + 1); //設置起始行,從1開始編號
pageInfo.setPages(totalPages); // 設置總的頁數
pageInfo.setTotal(recordsNum); // 設置總的記錄數
pageInfo.setNextPage(nextPage); //設置下一頁的頁碼
pageInfo.setPageNum(pageNum); //設置當前頁
pageInfo.setPrePage(prePageNum); // 設置前一頁的頁碼
pageInfo.setEndRow(endIndex); // 設置最後一行記錄的編號
return pageInfo;
}
參數說明:
1、list : 當前頁要展示的數據。
2、pageNum :當前頁號
3、pageSize : 一頁要展示的記錄數
4、recordsNum : 總的記錄數
在這當中有一個計算分頁數的小技巧:
Integer totalPages = (recordsNum + pageSize -1)/ pageSize;
為什麼這樣可以呢?
因為對於一個數與另一個數相除,然後向上取整而言,兩個數最小相差1,減去1除去被除數,就可以得到兩者相除的最大整數部分,然後再加1就可以得到向上取整的結果。因此,這個方法的實際效果就相當於math.ceil(1.0*recordsNum / pageSize)。
另外,傳過來的參數list,也需要對它進行截取,具體的截取的方法:
Integer recordsNum = list.size(); // 原始的查詢結果
Integer endIndex = pageNum * pageSize > recordsNum ? recordsNum : pageNum * pageSize; //判斷最後一條記錄。防止在下一步取subList的時候,出現下標溢出的情況。
List<CooperCom> subList = list.subList((pageNum - 1) * pageSize, endIndex); // 注意,subList是包含起始位置,不包含結束位置