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

目录
  • 前言
  • 使用
    • 1、SpringDataJPA分页
    • 2、MyBatis分页
    • 3、Hutools工具类分页
  • 总结

前言

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分页,只需在服务层使用一个工具类分页即可,既灵活又便于阅读,简直是分页的神器。

到此这篇关于Java项目开发中实现分页的三种方式的文章就介绍到这了,更多相关Java实现分页的三种方式内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java实现分页的前台页面和后台代码

    本文实例为大家分享了Java分页展示的具体代码,供大家参考,具体内容如下 先上图吧,大致如图,也就提供个思路(ps:使用了SSH框架) 前台JSP页面 <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <%@taglib prefix="s" uri="/struts-tags

  • Java分页查询--分页显示(实例讲解)

    当数据库中数据条数过多时,一个页面就不能显示,这是要设置分页查询,首先要使用的是数据库sql语句的limit条件实现分组查询 sql语句大概形式为: select * from table limit 开始索引,显示条数 用该语句就会实现分块查询,并且每页显示固定条数. 首先要实现后台分页,我们需要知道它有多少页,每页有多少行,这就需要知道一共多少行,调用sql语句时还需要知道每一页的开始索引,开始索引是根据当前页数算出来的,所以还需要知道当前页数,查询后会返回一个列表存储当前页数据.将这些属性

  • Java实现简单的分页功能

    本文实例为大家分享了Java实现分页功能的具体代码,供大家参考,具体内容如下 不用根据改变SQL的形式去查询; 直接查询所有的数据,根据页码自动显示数据; 分页对象 public class PageUtils implements Serializable { /** * */ private static final long serialVersionUID = -5247614532234782640L; public final static String PAGE = "page&q

  • java实现分页显示效果

    本文实例为大家分享了java实现页显示效果的具体代码,供大家参考,具体内容如下 效果图如下: 实现步骤: 1.创建实体User.class,参考代码如下: public class User { private String name; private int age; private String gender; public String getName() { return name; } public void setName(String name) { this.name = nam

  • Java分页工具类及其使用(示例分享)

    Pager.java package pers.kangxu.datautils.common; import java.io.Serializable; import java.util.List; /** * * <b> 分页通用类 </b> * * @author kangxu * @param <T> * */ public class Pager<T> implements Serializable { /** * */ private stati

  • Java实现分页代码

    在项目中,分页是一个项目中必不可少的,它可以防止我们从数据库中进行大量数据查询时速度变慢,提高我们的查询效率. 1.定义分页模型:PageModel package com.common.page; import java.util.List; /** * 封装分页信息 * @author Administrator * */ public class PageModel<E> { //结果集 private List<E> list; //查询记录数 private int to

  • java分页工具类的使用方法

    说明:曾经在网上看过花样繁多的分页,很多都号称如何通用,但很多时候往往不尽如人意:有在分页类中还加入URL地址信息的,有在分页类中还进行分页动作处理(此动作完全属于操作数据库方面的事情)的.现在好了,经本人总结与提炼: 无论你是否自己手动分页,还是借助了框架进行分页.此工具类都可以帮助你达到稳定的分页效果(包括导航页码功能),而且使用方法也相对简单:好了,废话少说,代码如下: package test.dao; import java.util.List; /** * 用于分页的工具类 * @a

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

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

  • Java中获取时间戳的三种方式对比实现

    Java中获取时间戳 三种方式对比 最近项目开发过程中发现了项目中获取时间戳的业务.而获取时间戳有以下三种方式,首先先声明推荐使用System类来获取时间戳,下面一起看一看三种方式. 1.System.currentTimeMillis() System类中的currentTimeMillis()方法是三种方式中效率最好的,运行时间最短.开发中如果设计到效率问题,推荐使用此种方式获取. System.currentTimeMillis() 2.new Date().getTime() 除了Sys

  • Java中实现线程的三种方式及对比_动力节点Java学院整理

    Java中创建线程主要有三种方式: 一.继承Thread类创建线程类 (1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务.因此把run()方法称为执行体. (2)创建Thread子类的实例,即创建了线程对象. (3)调用线程对象的start()方法来启动该线程. package com.thread; public class FirstThreadTest extends Thread{ int i = 0; //重写run方法,run方法的方

  • Java中线程Thread的三种方式和对比

    介绍 多线程主要的作用就是充分利用cpu的资源.单线程处理,在文件的加载的过程中,处理器就会一直处于空闲,但也被加入到总执行时间之内,串行执行切分总时间,等于每切分一个时间*切分后字符串的个数,执行程序,估计等几分钟能处理完就不错了.而多线程处理,文件加载与差分过程中 一.Java实现多线程的三种方式 1.继承Thread 通过Thread继承,并重写run方法来实现多线程,案例如下: public class ThreadPattern extends Thread { @Override p

  • java从命令行获取数据的三种方式代码实例

    这篇文章主要介绍了java从命令行获取数据的三种方式代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 第一种:利用Scanner对象 import java.util.Scanner; public class TestInputOuput { public static void main(String[] args) { System.out.println("请输入:"); Scanner inp = new Scanne

  • Java后端之俯瞰数据接收的三种方式

    目录 一.前言 二.正文部分 第一种方法: 第二种方法: 第三种方法: 三种方法概览图: 一.前言 前面我们说了一些网页表单的功能,现在我们先来讲解数据的传输,如何进行前后端的联系 (建议先看完上篇) 二.正文部分 首先我们要先打开我们idea,如图,在jsp下的<form>也就是问卷的哪里加上action=" ", 这是在给这个弄个地址," "内容是任意的 第二步:在Demo下的Demo类下输入划线内容,只需输入@R看着选到即可回车 第三步:输入下列画

  • springboot项目启动后执行方法的三种方式

    目录 1 方法 方法1:spring的ApplicationListener< ContextRefreshedEvent>接口 方法2:springboot的ApplicationRunner接口 方法3:springboot的CommandLineRunner接口 2 指定执行顺序 3 原理 springboot项目启动后执行方法,有三种实现方式. 1 方法 ApplicationListener< ContextRefreshedEvent> 不推荐 ApplicationL

  • Struts 2中实现Ajax的三种方式

    Ajax本质上和普通的HTTP请求是一样的,只不过普通的HTTP请求是给人看的,而Ajax请求是给JS代码去用的. 所以Ajax请求的页面一般比普通的HTTP请求的响应内容还要简单,可能是一个页面的一部分,也可能是xml.json等结构化的数据,还可能是一个简单的字符串. 所以,在Struts 2中使用Ajax,Action一般就不会调用一个jsp视图来显示了(如果Ajax请求内容是页面的一部分也可能调用jsp视图),而是通过一些其他的方式. 下面介绍了三种方法,用于Action实现Ajax请求

  • Java实现指定线程执行顺序的三种方式示例

    本文实例讲述了Java实现指定线程执行顺序的三种方式.分享给大家供大家参考,具体如下: 方法一:通过共享对象锁加上可见变量来实现. public class MyService { private volatile int orderNum = 1; public synchronized void methodA() { try { while (orderNum != 1) { wait(); } for (int i = 0; i < 2; i++) { System.out.printl

  • scala中停止循环的三种方式(推荐)

    Scala 循环 有的时候,我们可能需要多次执行同一块代码.一般情况下,语句是按顺序执行的:函数中的第一个语句先执行,接着是第二个语句,依此类推. 编程语言提供了更为复杂执行路径的多种控制结构. 循环语句允许我们多次执行一个语句或语句组,下面是大多数编程语言中循环语句的流程图: 开始正文介绍: 1:使用return关键字 object BreakLoop { //1.使用return关键字 def add():Unit= { for(i <- 1 to 10){ if(i==7){ //停止循环

随机推荐