【SpringBoot】SpringBoot中分页插件(PageHelper)的使用

目录

1.分页概念

2.原生写法

3.PageHelper插件分页查询

3.1 介绍

3.2?使用

3.3 Page对象和PageInf对象


1.分页概念

用户查询的数据不可能一次性全部展示给用户(如果用户有一万条数据呢),而是分页展示给用户,这就是分页查询。

2.原生写法

步骤:

controller层:

  1. 接受请求,请求数据=页码+每页数量+查询条件(非必须)
  2. 调用业务层完成分页查询
  3. 将结果响应给前端

service层:

  1. 换算起始查询的行号(就是用户点击的第几页,该页的第一条是数据的第几行)
  2. 调用数据层完成分页查询
  3. 调用数据层完成数量的查询
  4. 封装结果(数据+数量)【创建一个对象接受】
  5. 返回给controller层

mapper层:

  1. 动态SQL拼接带条件的分页查询数据(数据)
  2. 动态查询符合条件的数据总数(数量)

为啥要封装一个对象接受呢?

客户端需要两条数据,一个是分页查询的数据,还有一个是分页查询的总条数,但是返回值只能返回一个,因此要封装在一个对象中,代码如下。

package com.its.domain;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.List;@Data
@AllArgsConstructor
@NoArgsConstructor
public class PageResult {private Object data;private Long total;
}

案例测试

需求:将所有的房间分页查询出来展示。

controller层方法

package com.its.controller;import com.its.domain.PageResult;
import com.its.domain.Result;
import com.its.domain.Room;
import com.its.service.TestService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class TestController {@PostMapping("/selectAllRoom")public Result selectAllRoom(Room room, Integer pageNo, Integer pageSize){
//        1.接受请求,请求数据为 页码数+每页的数量+查询的条件return testService.selectAllRoom(room,pageNo,pageSize);}
}

service层代码

package com.its.service.Impl;import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.its.domain.PageResult;
import com.its.domain.Result;
import com.its.domain.Room;
import com.its.mapper.TestMapper;
import com.its.service.TestService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class TestServiceImpl implements TestService {@Overridepublic Result selectAllRoom(Room room, Integer pageNo, Integer pageSize) {
//        将页码数换算成行数int pageStart = (pageNo-1)*pageSize;
//        调用mapper层完成分页查询List<Room> rooms = testMapper.selectAllRoom(room, pageStart, pageSize);
//        再查询总数量long total = testMapper.selectTotal(room);
//        封装成对象返回Result result = new Result(rooms, total);return result;}
}

mapper

package com.its.mapper;import com.its.domain.PageResult;
import com.its.domain.Room;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;import java.util.List;@Mapper
public interface TestMapper {
//    原生分页查询List<Room> selectAllRoom(@Param("room") Room room,@Param("pageStart") Integer pageStart,@Param("pageSize") Integer pageSize);int selectTotal(@Param("room") Room room);
}

xml映射SQL文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.its.mapper.TestMapper">
//分页查询符合条件的数据<select id="selectAllRoom" resultType="com.its.domain.Room">select * from room<where><if test="room.info!=null and room.info!=''">info like concat('%',#{room.info},'%')</if></where>limit #{pageStart},#{pageSize}</select>
//查询总数量<select id="selectTotal" resultType="java.lang.Integer">select count(1) from room<where><if test="room.info!=null and room.info!=''">info like concat('%',#{room.info},'%')</if></where></select>
</mapper>

在postMan中测试得到如下结果,分页查询完成

3.PageHelper插件分页查询

3.1 介绍

步骤:

controller层(不变):

  1. 接受请求,请求数据=页码+每页数量+查询条件(非必须)
  2. 调用业务层完成分页查询
  3. 将结果响应给前端

service层:

  1. 调用PageHelper中的 startPage(参数页码,每页数量) 方法,然后返回一个Page对象。
  2. 调用数据层完成分页查询
  3. 直接用Page对象中的方法封装结果(数据+数量)
  4. 返回给controller层

mapper层:

  1. 直接动态SQL拼接带查询条件的查询(SQL语句中不用使用limit)

【原理介绍】

流程其实是一样的,只是该插件在内部封装了一些方法供我们使用。PageHelper插件基于拦截的原理实现对mapper层编写的SQL语句进行二次处理,如下:

  • 会给查询的SQL语句进行语句拼接,添加limit,并赋值分页条件
  • 会动态生成查询数量的SQL语句并执行。
  • 会将分页相关的所有结果(分页数量+数量+页码数+起始查询行号+每页的数量等)封装到一个Page对象中。

Page中方法介绍:

3.2使用

代码书写,还是以上面为例。

(1)导入PageHelper所需依赖

<!--分页插件依赖--><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.4.7</version></dependency>

(2)controller层

package com.its.controller;import com.its.domain.PageResult;
import com.its.domain.Result;
import com.its.domain.Room;
import com.its.service.TestService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class TestController {@AutowiredTestService testService;@PostMapping("/selectAll")
//参数为查询条件,页数,每页的展示数public PageResult selectAll(Room room,Integer pageNo,Integer pageSize){PageResult pageResult = testService.selectAll(room, pageNo, pageSize);return pageResult;}}

(3)service层

package com.its.service.Impl;import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.its.domain.PageResult;
import com.its.domain.Result;
import com.its.domain.Room;
import com.its.mapper.TestMapper;
import com.its.service.TestService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class TestServiceImpl implements TestService {@AutowiredTestMapper testMapper;@Overridepublic PageResult selectAll(Room room, Integer pageNo, Integer pageSize) {
//        开启分页查询,当执行查询时,插件进行相关的sql拦截进行分页操作,返回一个page对象Page<Room> page = PageHelper.startPage(pageNo, pageSize);
//        调用mapper层完成查询testMapper.selectAll(room);
//        封装结果PageResult pageResult = new PageResult(page.getResult(), page.getEndRow());System.out.println(pageResult);System.out.println(page);return pageResult;}}

(4)mapper层

package com.its.mapper;import com.its.domain.PageResult;
import com.its.domain.Room;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;import java.util.List;@Mapper
public interface TestMapper {
//    使用分页插件分页查询List<Room> selectAll(@Param("room") Room room);
}

(5)xml映射文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.its.mapper.TestMapper"><select id="selectAll" resultType="com.its.domain.Room">select * from room</select></mapper>

(6)测试结果:

3.3 Page对象和PageInf对象

在 PageHelper 中,Page 和 PageInfo 都是用来处理分页数据的重要类。

Page对象

  • Page 是一个接口,它包含分页数据以及一些基本的分页信息(如总记录数、当前页等)。当使用 PageHelper 进行分页查询时,查询结果会被自动封装到一个实现了 Page 接口的对象中。

PageInfo对象

  • PageInfo 是 PageHelper 提供的一个类,用于封装更详细的分页信息。它不仅包含了分页数据,还提供了更多的辅助信息,如是否为第一页、最后一页、导航页码等。

使用PageInfo进行上面的替换,业务层代码为

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/35908.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

python操作数据库

文章目录 基础使用数据插入 基础使用 python使用第三方库pymysql来操作mysql数据库 安装&#xff1a; pip install pymysqlfrom pymysql import Connection# 获取到MySQL数据库的链接对象conn Connection(hostlocalhost # 主机名,port3306 # 端口&#xff0c;默…

【01】栅格切片服务发布

本文探讨的是使用GeoScene Server本身的能力去切瓦片&#xff0c;它可以很好地通过server自带的CachingTools GP服务去切片&#xff0c;可以通过调整该gp服务的最大实例数能够更好利用server所在机器cpu的能力&#xff1b; 如果server站点已经发布了很多服务&#xff0c;则不建…

非极大值抑制(Non-Maximum Suppression,简称NMS)是什么?

非极大值抑制&#xff08;Non-Maximum Suppression&#xff0c;简称NMS&#xff09;是一种常用于目标检测任务中的后处理技术&#xff0c;主要用于从多个候选框中选出最合适的边界框&#xff0c;并抑制那些与最优候选框重叠度高且分类置信度低的框。 NMS的目的&#xff1a; 在…

【Java】A *算法的应用

代码和测试图片下载地址&#xff1a; https://download.csdn.net/download/r77683962/90089371 这个地图里黑色部分是不能通过的&#xff0c;白色部分是可以通过的&#xff0c;这个算法没问题&#xff0c;有点感觉效率不太高。。。。。 效果&#xff1a; 源代码PathFind.java&…

日本IT|企业需要什么样的技术?

日本IT企业所需的技术非常多样化&#xff0c;涵盖了多个领域和方面。以下是一些日本IT企业通常所需的主要技术&#xff1a; 一、编程语言与工具 编程语言&#xff1a;Java、Python、C、C#、PHP等是日本IT企业常用的编程语言。这些语言在软件开发、数据分析、网络应用等方面都…

刘铁猛C#入门 030 泛型,partial类,枚举,结构

泛型(generic)无处不在 为什么需要泛型&#xff1a;避免成员膨胀或者类型膨胀 正交性&#xff1a;泛型类型(类/接口/委托/......)泛型成员(属性/方法/字段/....类型方法的参数推断 泛型接口/类的 类型参数不只有一个泛型与委托、lambda表达式实现泛型接口类时 &#xff0c;实现…

视频加密的好处与加密方法分析2024

视频内容的多样化不止局限于电视、电影&#xff0c;在日常培训学习中也是必不可少的。那么对于做知识付费的人来说&#xff0c;视频内容的安全性就尤为重要。视频加密也就i随之兴起&#xff0c;为视频内容安全多了一层保障&#xff0c;那么主要体现下那几个方面呢&#xff1f;可…

鸿蒙UI开发——亮/暗色模式适配

1、概 述 系统存在深浅色两种显示模式&#xff0c;为了给用户更好的使用体验&#xff0c;应用最好适配暗色和亮色两种模式。从应用与系统配置关联的角度来看&#xff0c;适配暗色和亮色模式可以分为下面两种情况&#xff1a; 应用跟随系统的深浅色模式&#xff1b; 应用主动设…

三菱伺服JET产品线(选型说明)

伺服放大器功能提升 伺服放大器MELSERVO-JET系列为进一步优化了独家控制引擎的高性能伺服放大器。 可通过与支持CC-LinK IE TSN的运动控制器的同步通信,进行高 速、高精度的运动控制。 除了旋转型伺服电机以外,还支持线性伺服电机。MR-JET-G-N1支持EtherCAT。 旋转型伺服电机 …

HarmonyNext如何判断上下分屏

鸿蒙系统支持上下分屏&#xff0c;可以同时使用两个应用&#xff0c;比如&#xff1a; 有时候我们需要在分屏的时候处理相关逻辑&#xff0c;那到底该如何处理了&#xff0c; 首先在UIAbility下的onWindowStageCreate中进行监听 //监听窗口变化let windowClass: window.Window…

寄存器点灯

1.keil创建工程。&#xff08;不再概述&#xff09; 2.需要添加启动文件。所以添加库文件中的第二个。 3.启动顺序。上电后先初始化堆栈指针&#xff0c;再运行该汇编&#xff0c;最后跳入main函数&#xff0c;系统初始化是初始化时钟的&#xff0c;暂时不需要&#xff0c;屏蔽…

tomcat 运行加载机制解析

tomcat 运行加载机制 从tomcat jar包的加载顺序&#xff1a; tomcat的具体运行加载 可以从 start、setclasspath、catalina文件中看出来&#xff1a; start.bat执行 去找bin目录下的catalina.bat,catalina 或去找 bin\setenv.bat以获取标准环境变量&#xff0c;然后去找bin\…

OLED显示图片,文字

显示图片 1.这是随便一张的图片&#xff0c;自己可以随便截图一张 2.单击图片&#xff0c;右边选择编辑 3.如下操作 4.然后&#xff0c;这个水平和垂直的值的设置要根据你所使用的屏幕有多少个像素点&#xff0c;我当前使用的是0.96寸OLED屏幕&#xff0c;也就是12864&#x…

猿辅导持续布局AI赋能教育领域,助推教育行业数字化转型

近日&#xff0c;由人民网主办的“AI之夜”活动在北京隆重举行。“AI之夜”活动旨在展示中国在人工智能领域的最新成果和创新应用&#xff0c;推动行业的交流与合作。活动现场&#xff0c;来自不同领域的专家们通过主题演讲、圆桌讨论和案例分享等形式&#xff0c;全面呈现了中…

Zotero版本兼容问题,无法安装插件“%s”

1.问题&#xff1a;zotero-better-notes与zotero版本不兼容 安装插件zotero-better-notes时&#xff0c;出现插件安装失败提示&#xff1a;无法安装插件“%S"。他可能无法与该版本的Zotero兼容 zotero-better-notes&#xff1a;是一款论文阅读笔记插件&#xff0c;之前一…

Profinet IO从站数据 转 opc ua项目案例

目录 1 案例说明 2 VFBOX网关工作原理 3 准备工作 4 使用PRONETA软件获取PROFINET IO从站的配置信息 5 设置网关采集PROFINETIO从站设备数据 6 启动OPC UA协议转发采集的数据 7 选择槽号和数据地址 8 选择子槽号 9 案例总结 1 案例说明 设置网关采集ProfinetIO从站设…

android studio 读写文件操作(应用场景二)

android studio版本&#xff1a;2023.3.1 patch2 例程&#xff1a;readtextviewIDsaveandread 本例程是个过渡例程&#xff0c;如果单是实现下图的目的有更简单的方法&#xff0c;但这个方法是下一步工作的基础&#xff0c;所以一定要做。 例程功能&#xff1a;将两个textvi…

基于SSM框架企业人事管理系统的设计与实现

系统合集跳转 源码获取链接 一、系统环境 运行环境: 最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 IDE环境&#xff1a; Eclipse,Myeclipse,IDEA或者Spring Tool Suite都可以 tomcat环境&#xff1a; Tomcat 7.x,8.x,9.x版本均可 操作系统…

百度智能云 CHPC: 使用 BtuneAK对基因测序软件进行加速

背景 本文主要介绍在 CHPC 平台使用 BtuneAK 自动化加速组件&#xff0c;可以直接对BWA、FastQC、Picard、Trimmomatic等业务端到端时长加速。 Btune 简单介绍 BtunePK介绍 BtunePK 是百度自研的一款性能分析和调优工具&#xff0c;兼容Intel、AMD、ARM三个CPU平台&#xff0…

Power BI - 批量导入数据

1.简单介绍 假定已经使用Power Automate Desktop(微软的RPA产品&#xff0c;是Power Platform平台的其中一个产品)从福布斯中文网获取了各地区的2024年的财富数据如下&#xff0c; 现在想批量导入数据到Power BI中&#xff0c;分析一下各地区的产业以及财富情况 2.具体说明 …