Java项目开发中实现分页的三种方式总结
作者:福隆苑居士 发布时间:2021-08-25 21:36:36
标签:java,分页
前言
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;
}
来源:https://www.cnblogs.com/fulongyuanjushi/p/15864228.html


猜你喜欢
- 一、安装activeMQLinux环境ActiveMQ部署方法:https://www.aspxhome.com/article/16232
- 数组实现Java 自定义Queue队列及应用Java 自定义队列Queue:队列的抽象数据类型就是一个容器,其中的对象排成一个序列,我们只能
- @PropertySource读取配置文件通过@Value参数注入有参数文件如下test.propertiesproject.author=
- 本文实例讲述了Android列表控件Spinner简单用法。分享给大家供大家参考,具体如下:Android的Spinner控件用来显示列表项
- 前言公司最近在开发中遇到一个问题,在弄帖子的发布与回复问题,然后再iOS端和Android端添加表情的时候都会出错Caused by: ja
- 本博文将为您提供自Java 7以来增加的很棒的新功能的示例。我将展示每个Java版本的至少一项重大改进,一直到2020年秋季发布的Java
- Task的应用Task的MSDN的描述如下:【Task类的表示单个操作不会返回一个值,通常以异步方式执行。Task对象是一种的中心思想基于任
- 因为这段时间在学习Socket,所以就试着写了一个简单的聊天室。主要分为服务器端和多个客户端。利用服务器端作数据中转站,实现消息群发。1、服
- IOS的滑动按钮菜单在UI设计里面绝对堪称一绝,在学习了Android的自定义view后,我萌生了模仿它的想法。实现上面的模拟需要自定义一个
- 本文实例讲述了C#编程实现取整和取余的方法。分享给大家供大家参考,具体如下:"%"为取余号,不用多说。 "/&
- execution (常用,方法级别的匹配)语法:execution(modifiers-pattern? ret-type-pattern
- java中有关单链表反转的方法有很多种,这里记录一种并附上详细步骤:代码如下/** * Definition for singly
- 前言当我们在手机上使用360安全卫士时,手机屏幕上时刻都会出现一个小浮动窗口,点击该浮动窗口可跳转到安全卫士的操作界面,而且该浮动窗口不受其
- 我们知道,多线程是Android开发中必现的场景,很多原生API和开源项目都有多线程的内容,这里简单总结和探讨一下常见的多线程切换方式。我们
- 本文实例讲述了Android开发判断一个app应用是否在运行的方法。分享给大家供大家参考,具体如下:在一个应用中,或一个Service 、R
- springboot 无法自动装配@Autowired 报错:无法自动装配基本上是因为1、项目里有类似mybatis @Mapper这种第三
- 前言:Stream API 和 Lambda 是Java8的重要特性让我们可以使用更具功能性的语法风格。但是在编写的代码时候一个更大的问题是
- 本文实例为大家分享了C#实现银行家算法的具体代码,供大家参考,具体内容如下1.死锁死锁,顾名思义,是一种锁住不可自行解开的死局。在操作系统中
- 项目背景我们开发过程中会碰到这样一类问题,就是数据层或三方接口返回的Bean对象需要转换重新装换一下我们需要的对象。我们通常的做法就是通过g
- 前言fragment 可认为是一个轻量级的Activity,但不同与Activity,它是要嵌到Activity中来使用的,它用来解决设备屏