java 实现常用后端分页

2023-11-08

背景说明

在实际开发中,基于数据库表结构进行SQL查询,如果要对结果进行分页,可以借助一些工具类,如:基于Mybatis的 工具类 PageHelper。

但是,有时分页的对象是经过一些业务逻辑处理的列表,如:两个列表取了交集后,或者按照一定的条件过滤后的列表,需要进行分页。

此时,在不进行前端分页的情况下,就需要用到后端分页。

方法一

import lombok.Data;

import java.io.Serializable;

@Data
public class Page  implements Serializable {

  private static final long serialVersionUID = -3989189348324121L;

  /**
     * 默认页码
     */
  public static final int DEFAULT_PAGE_NO = 1;

  /**
     * 默认分页条数
     */
  public static final int DEFAULT_PAGE_SIZE = 20;

  /**
     * 分页最大条数
     */
  public static final int MAX_PAGE_SIZE = 500;

  /**
     * 是否需要分页
     */
  private boolean needPagination = true;

  private int pageIndex = DEFAULT_PAGE_NO;

  private int pageSize = DEFAULT_PAGE_SIZE;

  public int getPageIndex() {
    // 当前页码小于 1 的话就返回 1
    return Math.max(this.pageIndex, 1);
  }

  public int getPageSize() {
    // 分页条数小于 1 返回默认分页条数
    if (this.pageSize < 1) {
      pageSize = DEFAULT_PAGE_SIZE;
    }
    // 分页条数大于 500 返回最大条数 500
    if (this.pageSize > 500) {
      pageSize = MAX_PAGE_SIZE;
    }
    return this.pageSize;
  }

  // 获取偏移量
  public int getOffset() {
    return (this.getPageIndex() - DEFAULT_PAGE_NO) * this.getPageSize();
  }

  public boolean isNeedPagination() {
    return this.needPagination;
  }

  public void setPageIndex(int pageIndex) {
    this.pageIndex = pageIndex;
  }

  public void setPageSize(int pageSize) {
    this.pageSize = pageSize;
  }

  public void setNeedPagination(boolean needPagination) {
    this.needPagination = needPagination;
  }

}

方法二

1、分页结果返回类

ResultList.java

package com.miracle.luna.page;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

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;

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>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java 实现常用后端分页 的相关文章

随机推荐

  • 递归完成斐波拉契--函数递归与栈

    什么是递归 递归是一种重要的程序设计方法 简单的说 若在一个函数 过程或数据结构的定义中又应用了它自身 则这个函数 过程或数据结构称为是递归定义的 简称递归 什么是栈 栈是一种数据结构 略 栈与递归的关系 使用计算机实现递归 其实是一种栈的
  • 【项目仿真】温湿度智能监控系统设计(Proteus仿真)

    将单片机项目仿真 温湿度智能监控系统设计分享出来 如有不足 敬请指出 实验图片 实验视频 项目仿真 温湿度智能监控系统设计 Proteus仿真 目录 一 设计要求 二 程序软件 三 资料链接 四 关于作者 一 设计要求 通过Proteus仿
  • 科大讯飞、博世、蔚来、华为实习面试总结

    实习面试总结 为了给自己的秋招先铺铺路 找了一些公司实习面试 需要注意 华为实习很看学历 本科基本上过不了简历 苏州科大讯飞 挂 岗位 硬件实习生 问题 1 PCB板子上对外输出电流的时候是不是需要对电流的开关进行控制 如果需要的话 用什么
  • 4378 选取数对(递推)

    1 问题描述 给定一个长度为 n 的整数数列 a1 a2 an 请你选择 k 个数对 l1 r1 l2 r2 lk rk 要求所选数对满足 1 l1 r1 lt l2 r2 lt lt lk rk n 对于 1 i k ri li 1 m
  • Highly recommend using Dart Sass.

    为什么要替换 1 因为node sass和node js版本关联太紧了 如果这两个版本不匹配 就会起冲突 导致项目无法运行 但是dart sass 安装没有兼容性问题 2 sass官网团队也强烈建议使用dart sass sass团队强烈建
  • LNMP部署及搭建论坛

    目录 前言 一 LNMP架构的部署 理论 1 1 LNMP架构概述 1 2 MySQL安装配置 1 3 PHP解析环境的安装 1 4 配置Ngnx支持PHP环境 二 LNMP应用部署 实操 2 1 Nginx安装 2 1 1 编译安装步骤
  • HDLbits Popcount3的一点疑问

    题目 A population count circuit counts the number of 1 s in an input vector Build a population count circuit for a 3 bit i
  • FFmpeg从RTSP获取流时:h264、h265 判断 I 帧的方法

    H264中 I 帧的判断 这是用ffmpeg接口 av read frame 从IPC摄像头获取得到每一帧数据的前几十个字节 一般00 00 00 01分割之后的下一个字节就是NALU类型 NALU类型是可以用来判断帧的类型是I帧 还是P帧
  • Flask-SQLAlchemy(一) 一对一关系

    前言 课程中经常需要进行web开发 往往是采用Flask框架 建立数据库时就避免不了Flask SQLAlchemy的使用 此文章将记录创建关系表的过程 方便日后回顾以及大家交流讨论 一对一关系 下面的一对一关系以用户和身份证为例 首先创建
  • c++ 友元的三种形式和声明方式

    1 成员函数做友元 include
  • HDU 1716 排列2

    测试数据都能过但是WA 求帮看哪里出了问题 题目链接 Hdu 1716 使用STL的next permutation 函数求解 include
  • 消息驱动 微服务器,消息驱动的微服务 - Spring Cloud Alibaba RocketMQ

    引入MQ后的架构演进 MQ的选择 消息队列对比参照表 RocketMQ vs ActiveMQ vs Kafka 参考至 CentOS7上搭建RocketMQ 环境要求 CentOS 7 2 64位JDK1 8 4G 的可用磁盘空间 1 下
  • VIM工具设置步骤

    VIM工具设置步骤入门 引子 找到配置文件 修改配置文件 引子 VIM作为常用的文本编辑器有很多可以设置项 比如我们打开一个文件以后在命令行模式输入set nu来显示行号 但是这个是针对当前打开的这个文件有效 有时候我们想对所有用vim打开
  • Integer. valueOf()的用法

    Integer valueOf 作用 将基本类型int转换为包装类型Integer 或者将String转换成Integer String如果为Null或 都会报错 Integer valueOf 方法实现如下 public static I
  • 用 ASTERISK 搭建自己的免费 VOIP 服务器

    服务器别闲着 博主又要给大家带来新的玩法咯 1 这里以 Debian 为例子 安装 Asterisk apt get update apt get install asterisk 2 预设置 Asterisk 修改 sip conf 和
  • chrome浏览器安装插件方法

    我的浏览器版本 99 0 4844 51 正式版本 64 位 之前收集安装方法 现在做个处理 实际上对于我的不行 但总有一款适合你 首先打开chrome 的设置 gt 更多工具 gt 扩展程序 开启开发者模式 1 直接把 crx文件拖拽到这
  • java.sql.SQLException: Connection is read-only. Queries leading to data modification are not allowed

    2019独角兽企业重金招聘Python工程师标准 gt gt gt ssm框架报错 原因是事务配置在service spring的配置文件对应方法设置位read only true 解决办法 该方法是DML语句的方法 修改该方法的事务传播属
  • 专利申请过程中出现的20种状态,你都知道吗

    转自 https zhuanlan zhihu com p 32940506 专利申请过程中出现的20种状态 你都知道吗 从专利申请到专利驳回或者授权 会出现以下状态 归结起来 有以下一些 1 等待申请费 此状态表示 专利局已经受理该专利
  • java 读写中文文本

    读取中文文本 要设置gbk格式 该格式中文可以识别 英文也可以 reader new InputStreamReader new FileInputStream filename gbk 拓展 分词 分词时候 读取中文文本 TokenStr
  • java 实现常用后端分页

    背景说明 在实际开发中 基于数据库表结构进行SQL查询 如果要对结果进行分页 可以借助一些工具类 如 基于Mybatis的 工具类 PageHelper 但是 有时分页的对象是经过一些业务逻辑处理的列表 如 两个列表取了交集后 或者按照一定