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是包含起始位置,不包含結束位置

Advertisements

你可能會喜歡