java 实现常用后端分页

背景说明

在实际开发中,基于数据库表结构进行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>
  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以直接在你的网页里面显示搜查的结果。 github-java-api github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存工具 SimpleCache SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对业务代码零侵入 2. 支持使用Redis和Memcached作为后端缓存。3. 支持缓存数据分区规则的定义 4. 使用redis作缓存时,支持list类型的高级数据结构,更适合论坛帖子列表这种类型的数据 5. 支持混合使用redis缓存和memcached缓存。可以将列表数据缓存到redis中,其他kv结构数据继续缓存到memcached 6. 支持redis的主从集群,可以做读写分离。缓存读取自redis的slave节点,写入到redis的master节点。 Java对象的SQL接口 JoSQL JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器 j2wap j2wap 是一个基于Java的WAP浏览器,目前处于BETA测试阶段。它支持WAP 1.2规范,除了WTLS 和WBMP。 Java注册表操作类 jared jared是一个用来操作Windows注册表的 Java 类库,你可以用来对注册表信息进行读写。 GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列的数字图像。使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的PList类库 Blister Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端 JOpenID JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor 的文件持久化组件,以及一个高吞吐量的可靠事务日志组件。 Google地图JSP标签库 利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth 1.0a 和 OAuth 2.0 的框架,提供了简单的方式通过社交媒体进行身份认证的功能。 Eclipse的JavaScript插件 JSEditor JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮以及一些通用的面向对象方法。 Java数据库连接池 BoneCP BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K
Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以直接在你的网页里面显示搜查的结果。 github-java-api github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存工具 SimpleCache SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对业务代码零侵入 2. 支持使用Redis和Memcached作为后端缓存。3. 支持缓存数据分区规则的定义 4. 使用redis作缓存时,支持list类型的高级数据结构,更适合论坛帖子列表这种类型的数据 5. 支持混合使用redis缓存和memcached缓存。可以将列表数据缓存到redis中,其他kv结构数据继续缓存到memcached 6. 支持redis的主从集群,可以做读写分离。缓存读取自redis的slave节点,写入到redis的master节点。 Java对象的SQL接口 JoSQL JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器 j2wap j2wap 是一个基于Java的WAP浏览器,目前处于BETA测试阶段。它支持WAP 1.2规范,除了WTLS 和WBMP。 Java注册表操作类 jared jared是一个用来操作Windows注册表的 Java 类库,你可以用来对注册表信息进行读写。 GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列的数字图像。使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的PList类库 Blister Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端 JOpenID JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor 的文件持久化组件,以及一个高吞吐量的可靠事务日志组件。 Google地图JSP标签库 利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth 1.0a 和 OAuth 2.0 的框架,提供了简单的方式通过社交媒体进行身份认证的功能。 Eclipse的JavaScript插件 JSEditor JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮以及一些通用的面向对象方法。 Java数据库连接池 BoneCP BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值