前言

  Java项目开发中经常要用到分页功能,现在普遍使用SpringBoot进行快速开发,而数据层主要整合SpringDataJPA和MyBatis两种框架,这两种框架都提供了相应的分页工具,使用方式也很简单,可本人在工作中除此以外还用到第三种更方便灵活的分页方式,在这里一同分享给大家。

使用

主要分为SpringDataJPA分页、MyBatis分页、Hutools工具类分页几个部分

1、SpringDataJPA分页

1)、引入依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

2)、Service中编写分页服务

  SpringDataJPA分页就是定义Pageable对象来处理分页,其中PageRequest来定义分页参数,Page对象来接手查询结果进行分页包装,包装后的结果pageResult可以得到总记录数、总页数、分页列表等数据结果。

/**
* 根据doctorId查询全部关注列表【分页】
*
* @param doctorId 医生id
* @return 结果集
*/
public Map<String, Object> findAllListByDoctorId(Long doctorId, Integer pageIndex, Integer pageSize) {
Pageable pageable = PageRequest.of(pageIndex - 1, pageSize); // 分页
Page<Follow> pageResult = followRepository.findByDoctorIdOrderByCreatedAtDesc(doctorId, pageable);
List<FollowDTO> dtoList = followMapper.toDto(pageResult.getContent());
if (!CollectionUtils.isEmpty(dtoList)) {
// 处理业务逻辑....
}
// 封装分页结果
Map<String, Object> map = new HashMap<>();
map.put("pageIndex", pageIndex.toString()); // 当前页
map.put("pageSize", pageSize.toString()); // 每页条数
map.put("total", Long.toString(pageResult.getTotalElements())); // 总记录数
map.put("pages", Integer.toString(pageResult.getTotalPages())); // 总页数
map.put("list", dtoList); // 数据列表
return map;
}

3)、Repository中处理分页

  这里就是继承JpaRepository对象,然后传入service中定义好的pageable对象,并且返回Page包装的结果即可。

import com.patient.domain.Follow;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository; @Repository
public interface FollowRepository extends JpaRepository<Follow, Long> { Page<Follow> findByDoctorIdOrderByCreatedAtDesc(Long doctorId, Pageable pageable);
}
2、MyBatis分页

1)、引入PageHelper依赖

<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
</dependency>

2)、使用PageHelper实现分页

/**
* 查询推广人员列表,分页。
* @return 封装的分页结果对象
*/
public PageResult findPromotePersonList(String hospitalCode,PromotePersonReq promotePersonReq) {
Integer pageIndex = promotePersonReq.getPageIndex();
Integer pageSize = promotePersonReq.getPageSize();
PageHelper.startPage(pageIndex, pageSize); // 每页的大小为pageSize,查询第page页的结果
List<PromotePerson> list = promotePersonMapper.selectAll();
PageInfo<PromotePerson> pageInfo = new PageInfo<>(list);
PageHelper.clearPage();
// 返回分页结果
PageResult pageResult = new PageResult();
pageResult.setPageIndex(pageIndex);
pageResult.setPageSize(pageSize);
pageResult.setPages(pageInfo.getPages());
pageResult.setTotal((int) pageInfo.getTotal());
pageResult.setList(list);
return pageResult;
}
3、Hutools工具类分页

1)、引入依赖

  这里是可以单独引入hutools部分工具类的,具体参考官网文档,我平时写项目一定会使用这个工具,所以直接引入了所有。

<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.1.2</version>
</dependency>

2)、分页实现

  一般就用到两个工具类,一是PageUtil.totalPage(总记录数, 每页记录数)来计算总页数,二是CollUtil.page(索引, 每页记录数, 数据列表)来返回指定分页结果,注意这里的索引是从1开始的,和SpringDataJPA分页索引从0开始有区别。

/**
* 我的订单-待支付[分页]
*
* @param openid 用户唯一标识
* @return 结果集
*/
public Map<String, Object> findMyOrderNotPay(String openid, Integer pageIndex, Integer pageSize) {
Map<String, Object> map = new HashMap<>();
// 查询
List<ConsultOrder> orderList = consultOrderRepository.findMyOrderNotPay(openid);
if (CollectionUtils.isEmpty(orderList)) {
map.put("pageIndex", pageIndex.toString()); // 当前页
map.put("pageSize", pageSize.toString()); // 每页条数
map.put("total", "0"); // 总记录数
map.put("pages", "0"); // 总页数
map.put("list", new ArrayList<>()); // 数据列表
return map;
}
List<OrderVO> pageList = new ArrayList<>();
int totalSize = 0;
int totalPage = 0;
// 计算总页数
totalSize = orderList.size();
totalPage = PageUtil.totalPage(totalSize, pageSize);
// 分页,索引小于等于总页数,才返回列表.
if (pageIndex <= totalPage) {
// 分页
pageList = CollUtil.page(pageIndex, pageSize, orderVOList);
}
// 返回结果
map.put("pageIndex", Integer.toString(pageIndex)); // 当前页
map.put("pageSize", Integer.toString(pageSize)); // 每页条数
map.put("total", Integer.toString(totalSize)); // 总记录数
map.put("pages", Integer.toString(totalPage)); // 总页数
map.put("list", pageList); // 数据列表
return map;
}

总结

  1)、注意 :为了方便演示代码中直接用了Map对象来包装返回分页结果,在实际项目中,切记一定要自己定义实体对象作为返回结果,因为Map对象返回的结果如果是动态且数据量较大的列表,是存在造成内存泄露风险的,举个例子,比如返回10条问诊的分页记录时,其中聊天内容这个属性包含大量聊天数据,因为你无法确定对话的两个人到底聊了多少,可它确实作为一个属性包含在分页记录中;

  2)、SpringDataJPA分页,就是使用自带的Pageable对象来处理,需要注意的是分页索引从0开始,传错了会造成分页结果错乱或重复的现象;

  3)、Mybatis分页,就是借助PageHelper工具来实现,PageHelper.startPage和PageHelper.clearPage中间是需要分页的业务查询代码,可以通过PageInfo对象包装,获取其中需要的分页参数返回给前端展示;

  4)、Hutools分页,就是引入hutools工具类,使用其中的PageUtil和CollUtil工具类来实现,这种方式我个人比较喜欢,因为在较复杂的查询业务中,前两种实现起来很费劲还容易写错,不仅可能牵扯到多个类及方法,写完后过段时间也不容易阅读。而Hutools分页就类似于很早以前的分页方式,我把它理解为绿色简易版JSP分页,只需在服务层使用一个工具类分页即可,既灵活又便于阅读,简直是分页的神器。

  本人文章从来都是纯手打,且都来自实际工作中的经验及分享,如果觉得有一滴滴帮助,就点个推荐吧!(o..o)~

Java项目开发中实现分页的三种方式一篇包会的更多相关文章

  1. 《Maven在Java项目开发中的应用》论文笔记(十七)

    标题:Maven在Java项目开发中的应用 一.基本信息 时间:2019 来源:山西农业大学 关键词:Maven:Java Web:仓库:开发人员:极限编程; 二.研究内容 1.Maven 基本原理概 ...

  2. Java反射机制(创建Class对象的三种方式)

    1:SUN提供的反射机制的类: java.lang.Class<T> java.lang.reflect.Constructor<T> java.lang.reflect.Fi ...

  3. android中解析文件的三种方式

    android中解析文件的三种方式     好久没有动手写点东西了,最近在研究android的相关技术,现在就android中解析文件的三种方式做以下总结.其主要有:SAX(Simple API fo ...

  4. Struts中的数据处理的三种方式

    Struts中的数据处理的三种方式: public class DataAction extends ActionSupport{ @Override public String execute() ...

  5. iOS开发 跳转场景的三种方式

    iOS开发 跳转场景的三种方式 2012年10月17日, 15:32 假设A跳转到B,三种方法:1.按住ctrl键,拖动A上的控件(比如说UIButton)到B上,弹出菜单,选择Modal.不需要写任 ...

  6. Java 数组元素逆序Reverse的三种方式

    Java 数组元素逆序Reverse的三种方式   本文链接:https://blog.csdn.net/xHibiki/article/details/82930521 题目 代码实现 说明 int ...

  7. HTML中使用js的三种方式及优缺点介绍

    1.内部js: 在直接在页面的<script></script>标签内写js代码 优点:相对于使用行内js,内部js代码较为集中,与页面结构的实现代码耦合度较低,比较便于维护 ...

  8. JS中事件绑定的三种方式

    以下是搜集的在JS中事件绑定的三种方式.   1. HTML onclick attribute     <button type="button" id="upl ...

  9. JavaScript 中事件绑定的三种方式

    以下是在 JS 中事件绑定的三种方式.   1. HTML onclick attribute     <button type="button" id="uplo ...

随机推荐

  1. Counting Offspring(hdu3887)

    Counting Offspring Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  2. Network (poj1144)

    A Telephone Line Company (TLC) is establishing a new telephone cable network. They are connecting se ...

  3. Optimization Landscape and Expressivity of DeepCNNs

    目录 引 主要内容 基本的一些定义 卷积层 全连接层 池化层 改写卷积层 假设2.4 引理2.5 假设3.1 假设3.2 引理3.3 定理3.4 定理3.5 推论3.6 假设4.1 引理4.2 引理4 ...

  4. 带SD读卡的USB HUB方案芯片MA8621|用于带读卡的USB HUB拓展坞方案芯片MA8621

    MA8621是一款带SD读卡器控制器的USB 2.0高速3端口集线器方案芯片,主要用在USB TYPEC拓展坞或者USB typec扩展底座上面. 1. MA8621功能概述 MA8621是USB 2 ...

  5. maven打包报错 Fatal error compiling: tools.jar not found: C:\Program Files\Java\jre1.8.0_151\..\lib\tool

    maven 打包报错  [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.5.1:comp ...

  6. jsp:useBean的scope属性

    目录 1.分类 2.page 3.request 4.session 5.application 1.分类 对于jsp:useBean创建的对象,由jsp:useBean的可选属性scope指定,可以 ...

  7. java 关于 重写、覆写、覆盖、重载 的总结【不想再傻傻分不清了】

    1.前言 有些东西,名称不同,其实就是一个东西,你说是扯淡不? 2.重写 重写,又叫覆写.覆盖 ,注解@Override,词义为推翻 , 用法特点是继承父类后,重写的父类方法名字.参数.返回值必须相同 ...

  8. 利用Javaweb应用中六种属性范围,来理解Servlet的并发问题

    注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6513748225550189060/ Web应用中有六种属性范围: (1) 局部变量 (2) 实例变量 (3) 类 ...

  9. 利用python绘制分析路易斯安那州巴吞鲁日市的人口密度格局

    前言 数据来源于王法辉教授的GIS和数量方法,以后有空,我会利用python来实现里面的案例,这里向王法辉教授致敬. 绘制普查人口密度格局 使用属性查询提取区边界 import numpy as np ...

  10. Java 将PDF转为PDF/A

    通过将PDF格式转换为PDF/A格式,可保护文档布局.格式.字体.大小等不受更改,从而实现文档安全保护的目的,同时又能保证文档可读.可访问.本篇文章,将通过Java后端程序代码展示如何将PDF转为符合 ...