Java 實現 后端分頁
背景說明
在實際開發中,基於數據庫表結構進行SQL查詢,如果要對結果進行分頁,可以借助一些工具類,如:基於Mybatis的 工具類 PageHelper。
但是,有時分頁的對象是經過一些業務邏輯處理的列表,如:兩個列表取了交集后,或者按照一定的條件過濾后的列表,需要進行分頁。
此時,在不進行前端分頁的情況下,就需要用到后端分頁。
JAVA實現
1、分頁結果返回類
ResultList.java
package com.miracle.luna.page; import java.io.Serializable; import java.util.ArrayList; import java.util.List; /** * @author Miracle Luna * @date 2021/7/16 */
public class ResultList<T> implements Serializable { private static final long serialVersionUID = 1L; private final List<T> list = new ArrayList(); private Integer total; public ResultList() { } public ResultList(int total, List<T> list) { this.list.addAll(list); this.total = total; } public List<T> getList() { return this.list; } public void add(T entity) { this.list.add(entity); } public void setList(List<T> list) { this.list.addAll(list); } public Integer getTotal() { return this.total; } public void setTotal(Integer total) { this.total = total; } @Override public String toString() { return "ResultList(list=" + this.getList() + ", total=" + this.getTotal() + ")"; } }
2、分頁工具類
PageUtil.java
package com.miracle.luna.page; import com.google.common.collect.Lists; import java.util.List; /** * @author Miracle Luna * @date 2021/7/16 */
public class PageUtil { /** * 按照傳入的參數,進行分頁 * @param pageNum 頁數 * @param pageSize 每頁條數 * @param sourceList 源列表 * @param isPage 是否分頁 * @param <T> 泛型對象 * @return 返回結果集 */
public static <T> ResultList<T> page(Integer pageNum, Integer pageSize, List<T> sourceList, Boolean isPage){ ResultList<T> resultList = new ResultList<>(); // 初始化總量為0,防止當列表為空的時候,total返回null
resultList.setTotal(0); List<T> pageList = sourceList; // 當列表不為空的時候,才進行數據邏輯處理
if (sourceList != null && !sourceList.isEmpty()) { int sourceSize = sourceList.size(); if (isPage) { pageNum = (pageNum == null || pageNum <= 0) ? 1 : pageNum; pageSize = (pageSize == null || pageSize <= 0) ? 10 : pageSize; // 步驟分解,便於理解 // int startPosition = Math.min((pageNum - 1) * pageSize, sourceSize); // int endPosition = Math.min(pageNum * pageSize, sourceSize); // pageList = sourceList.subList(startPosition, endPosition); // 分頁的起始和截止位置,和源列表的size大小進行對比,分別取最小值
pageList = sourceList.subList(Math.min((pageNum - 1) * pageSize, sourceSize), Math.min(pageNum * pageSize, sourceSize)); } resultList.setList(pageList); resultList.setTotal(sourceSize); } return resultList; } public static void main(String[] args) { List<Integer> intList = Lists.newArrayList(1, 2, 3, 4, 5, 6, 7); // List<Integer> intList = Lists.newArrayList(); // ResultList<Integer> resultList = page(1, 3, intList, false); // ResultList<Integer> resultList = page(2, 3, intList, true); // ResultList<Integer> resultList = page(3, 3, intList, true); // ResultList<Integer> resultList = page(null, null, intList, true); // ResultList<Integer> resultList = page(2, 10, intList, true); // ResultList<Integer> resultList = page(2, 15, intList, true); // ResultList<Integer> resultList = page(1, 15, intList, true);
ResultList<Integer> resultList = page(1, 10, intList, true); System.out.println("resultList: " + resultList); } }
3、運行結果
本次測試以Integer列表,簡單舉例說明;
因為工具類中的List列表使用了泛型,所以,實際使用改工具類時,傳入實際業務邏輯中的對象列表即可。
resultList: ResultList(list=[1, 2, 3, 4, 5, 6, 7], total=7)
補充說明:
此處用到了google的一個工具包 guava-28.1-jre.jar;
這個包很好用,強烈推薦大家使用!!!
Maven 依賴如下:
<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>28.1-jre</version>
</dependency>
