Java项目开发中实现分页的三种方式总结

作者:福隆苑居士 时间:2021-08-25 21:36:36 

前言

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

标签:java,分页
0
投稿

猜你喜欢

  • java文件操作输入输出结构详解

    2023-07-30 21:48:30
  • Java分布式事务管理框架之Seata

    2023-09-28 11:50:36
  • 代码从windows下visual studio到andriod平台迁移实现步骤

    2022-05-23 11:21:39
  • Java 设计模式之责任链模式及异步责任链详解

    2021-08-08 19:14:23
  • Unity实现答题系统的示例代码

    2022-05-09 18:31:00
  • Java框架---Spring详解

    2021-07-09 14:27:30
  • Java经典面试题最全汇总208道(六)

    2023-11-23 17:52:45
  • C#中数组初始化与数组元素复制的方法

    2023-05-14 15:45:06
  • Android版本更新实例详解

    2023-08-05 21:54:54
  • 使用springCloud+nacos集成seata1.3.0搭建过程

    2022-06-19 02:48:47
  • Android定时器实现定时执行、重复执行、定时重复执行、定次数执行的多种方式

    2022-06-30 02:07:26
  • java中的final关键字详解及实例

    2022-03-02 11:26:59
  • Android四大组件之BroadcastReceiver详解

    2023-03-17 02:55:08
  • AndroidManifest.xml <uses-feature>和<uses-permisstion>分析及比较

    2023-11-05 12:17:12
  • Android抛物线下载动画制作过程

    2022-05-15 21:39:57
  • java Socket实现网页版在线聊天

    2022-10-19 12:13:42
  • Java抛出异常与自定义异常类应用示例

    2022-10-23 01:58:52
  • C#缓存之SqlCacheDependency用法实例总结

    2023-04-14 10:31:37
  • Android自定义定时闹钟开发

    2023-07-07 00:18:01
  • 利用C#操作WMI指南

    2022-05-07 18:02:42
  • asp之家 软件编程 m.aspxhome.com