在实际开发中,基于数据库表结构进行SQL查询,如果要对结果进行分页,可以借助一些工具类,如:基于Mybatis的 工具类 PageHelper。
但是,有时分页的对象是经过一些业务逻辑处理的列表,如:两个列表取了交集后,或者按照一定的条件过滤后的列表,需要进行分页。
此时,在不进行前端分页的情况下,就需要用到后端分页。
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>