Java分页查询的几种实现方法
作者:mmseoamin日期:2024-01-25

最近在做需求的过程中遇到几个需要分页查询的需求,我也对分页有了较深的了解。分页一般分为两种一种是直接在sql中分页,一种是在内存中分页。本文仅针对内存中分页做记录。

第一种

Java分页查询的几种实现方法,第1张

Java分页查询的几种实现方法,第2张

 

 如果是一个查询接口,向接口中传入page,和size(page默认值1,size默认值10)即可,返回参数是github的PageInfo,里面在放实际返回类型

进入实现层,使用PageHelper,并调用pageQuery方法即可完成分页,以下为Pagehelper的具体代码 。(但需注意,此方法只适用于从数据库中直接查出的数据,如果将查出的数据进行二次封装则会导致分页失败)

import com.github.pagehelper.Page;
import lombok.experimental.UtilityClass;
import org.springframework.beans.BeanUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import java.util.List;
import java.util.Objects;
import java.util.function.Supplier;
/**
 * @author LIUQIFAN
 */
@UtilityClass
public class PageHelper {
    /**
     * 要求 请求参数: ?pageNum=xxx&pageSize=xxx
     *
     * @param supplier 查询方法
     * @param       类型对象
     * @return 结果集
     */
    public static  PageInfo pageQuery(Supplier> supplier) {
        ServletRequestAttributes attributes = (ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes(), "无法获取request");
        Page page = com.github.pagehelper.PageHelper.startPage(attributes.getRequest());
        //========================
        List list = supplier.get();
        PageInfo pageInfo = new PageInfo<>();
        BeanUtils.copyProperties(page.toPageInfo(), pageInfo);
        pageInfo.setList(list);
        return pageInfo;
    }
    /**
     * @param pageNum  页号
     * @param pageSize 每页数据大小
     * @param       类型
     * @return 结果集
     */
    public static  PageInfo pageQuery(int pageNum, int pageSize, Supplier> supplier) {
        Page page = com.github.pagehelper.PageHelper.startPage(pageNum, pageSize, true);
        List list = supplier.get();
        PageInfo pageInfo = new PageInfo<>();
        BeanUtils.copyProperties(page.toPageInfo(), pageInfo);
        pageInfo.setList(list);
        return pageInfo;
    }
    /**
     * @param supplier 查询方法
     * @param       类型对象
     * @return 结果集
     */
    public static  List pQuery(Supplier> supplier) {
        ServletRequestAttributes attributes = (ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes(), "无法获取request");
        com.github.pagehelper.PageHelper.startPage(attributes.getRequest());
        //========================
        return supplier.get();
    }
    /**
     * @param pageNum  页号
     * @param pageSize 每页数据大小
     * @param       类型
     * @return 结果集
     */
    public static  List pQuery(int pageNum, int pageSize, Supplier> supplier) {
        com.github.pagehelper.PageHelper.startPage(pageNum, pageSize, true);
        return supplier.get();
    }
} 

第二种

这种方法是我第一次使用,把入参的page和size封装成了对象PageDomain

PageDomain代码如下

@Data
public class PageDomain1 {
    /**
     * 当前页
     */
    private Integer page = 1;
    /**
     * 每页数量
     */
    private Integer limit = 10;
    /**
     * 获取开始的数据行
     */
    public Integer start() {
        return (this.page - 1) * this.limit;
    }
    /**
     * 获取结束的数据行
     */
    public Integer end() {
        return this.page * this.limit;
    }
}

Java分页查询的几种实现方法,第3张

 这是控制层代码

Java分页查询的几种实现方法,第4张

 这是实现层代码,这里的resultList,是我们先从数据库中查出来的结果集,再用PageUtils的Startpage方法进行分页操作,最后组装PageInfo返回体

下面是PageUtils的代码

Java分页查询的几种实现方法,第5张