SpringBoot学习记录(四)之分页查询

SpringBoot学习记录(四)之分页查询

  • 一、业务需求
    • 1、基本信息
    • 2、请求参数
    • 3、相应数据
  • 二、传统方式分页
  • 三、使用PageHelper分页插件

一、业务需求

根据条件进行员工数据的条件分页查询
在这里插入图片描述

1、基本信息

请求路径: /emps
请求方式: GET
接口描述: 该接口用于员工列表数据的条件分页查询

2、请求参数

参数格式:queryString
参数说明:
在这里插入图片描述
请求数据样例:

/emps?name=张&gender=1&begin=2007-09-01&end=2022-09-01&page=1&pageSize=10

3、相应数据

参数格式:application/json
参数说明:返回总记录数和查找到的数据列表

{
"code": 1,
"msg": "success",
"data": {
	"total": 2,
	 "rows": [
		 {
		 "id": 1,
		 "username": "jinyong",
		 "password": "123456",
		 "name": "金庸",
		 "gender": 1,
		 "image": "https://web-framework.oss-cnhangzhou.aliyuncs.com/2022-09-02-00-27-53B.jpg",
		 "job": 2,
		 "entrydate": "2015-01-01",
		 "deptId": 2,
		 "createTime": "2022-09-01T23:06:30",
		 "updateTime": "2022-09-02T00:29:04"
		 },
		 {
		 "id": 2,
		 "username": "zhangwuji",
		 "password": "123456",
		 "name": "张无忌",
		 "gender": 1,
		 "image": "https://web-framework.oss-cnhangzhou.aliyuncs.com/2022-09-02-00-27-53B.jpg",
		 "job": 2,
		 "entrydate": "2015-01-01",
		 "deptId": 2,
		 "createTime": "2022-09-01T23:06:30",
		 "updateTime": "2022-09-02T00:29:04"
		 }
	 	]
	 }
 }

二、传统方式分页

在SQL语句中直接使用limit进行分页。

由于要返回一个结果列表(List)和总记录数(int \ long),所以需要额外添加一个PageBean实体类来接收返回的结果。

pojo.PageBean

@Data
@AllArgsConstructor
@NoArgsConstructor
public class PageBean {
    public long total; //总记录数
    public List rows; //结果列表
}

EmpController

@RestController
public class EmpController {
	@Autowired
    private EmpService empService;
    //    员工列表数据的条件分页查询  请求数据样例: emps?name=张&gender=1&begin=2007-09-01&end=2022-09-01&page=1&pageSize=10
    @GetMapping("/emps")
    public Result getEmps(@RequestParam(required = false) String name,
                          @RequestParam(required = false) Short gender,
                          @DateTimeFormat(pattern ="yyyy-MM-dd") LocalDate begin,
                          @DateTimeFormat(pattern ="yyyy-MM-dd") LocalDate end,
                          @RequestParam(defaultValue = "1") Integer page,  //页码
                          @RequestParam(defaultValue = "10") Integer pageSize) //每页记录数
{
		// PageBean实体类接收查询到的数据和总数据条数
        PageBean emps = empService.getEmps(name, gender, begin, end, page, pageSize);

        if(emps.getTotal() == 0){
            return Result.error("查询失败");
        }
        else {
            return Result.success(emps);
        }

    }
}

分页的重点在service层

EmpService

@Service
public class EmpServiceImpl implements EmpService {
	@Autowired
    private EmpMapper empMapper;


	@Override
	public PageBean getEmps(String name, Short gender, LocalDate begin, LocalDate end, Integer page, Integer pageSize) {
	     		
	    //  start是sql语句中limit条件的第一个参数,表示第几条记录 			
        int start = (page-1)*pageSize;  
        
        //  mapper中定义了两个sql,第一个是gerEmps,用来条件查询数据
        List<Emp> list = empMapper.getEmps(name, gender, begin, end,start,pageSize);
        
        //	mapper中第二个sql,getTotalEmp,用来查询总记录数量。
        long total = empMapper.getTotalEmp();
        
        //  使用有参构造,将两个结果封装
        PageBean emps = new PageBean(total,list);
        
        return emps;
    }
}

EmpMapper

<mapper namespace="com.itheima.mapper.EmpMapper">
<!--分页获取员工数据-->
    <select id="getEmps" resultType="Emp">
        select id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time from emp
        <where>
            <if test="name != null and name !='' " >
                name like concat('%',#{name},'%')
            </if>
            <if test="gender != null">
                and gender = #{gender}
            </if>
            <if test="begin != null and end != null" >
                and entrydate between #{begin} and #{end}
            </if> 
        </where>
                limit #{start},#{pageSize}
    </select>
 <!-- 使用count(*) 获取总记录数-->
    <select id="getTotalEmp" resultType="long">
        select count(*) from emp
    </select>
</mapper>

三、使用PageHelper分页插件

准备工作

导入依赖:

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

注意版本问题,我用的springboot版本为 3.x,所以对应的pagehelper要使用1.4.7及以上的版本。
最开始的时候我使用的是1.4.2版本,分页并未生效。

PageBean和controller层并未修改,不再额外展示。

EmpService

public class EmpServiceImpl implements EmpService {
	@Autowired
    private EmpMapper empMapper;

	@Override
    public PageBean getEmps(String name, Short gender, LocalDate begin, LocalDate end, Integer page, Integer pageSize) {
    
    	// 在进行数据库查询前启动分页,PageHelper.startPage( 想要查询的页码, 每页几条记录 );
        PageHelper.startPage(page, pageSize);
        
		// mapper查询到数据
        List<Emp> emps = empMapper.getEmps(name, gender, begin, end, page, pageSize);
 
        //把查询结果强转为Page类型  下面会介绍第二种形式
        Page<Emp> p = (Page<Emp>) emps;


		//Page中封装很多我们需要的信息,如getTotal是总记录数,getResult是分页之后的结果。
		//创建PageBean对象并将信息封装 并返回
        PageBean pageBean = new PageBean(p.getTotal(),p.getResult());

        return pageBean;
    }

}
 //把查询结果强转为Page类型
        Page<Emp> p = (Page<Emp>) emps;

这是其中的第一种方法,把查询的信息强转为Page,但还有另外一种方法。

// 将查询到的数据封装到PageInfo对象中。
		PageInfo<Emp> p = new PageInfo<Emp>(emps);
		
//  这种情况下,获取分页结果是 p.getList() 而不是 p.getResult()
		List<Emp> list= p.getList(); 

PageInfo中的其他信息

pageNum:当前页的页码
pageSize:每页显示的条数
size:当前页显示的真实条数
total:总记录数
pages:总页数
prePage:上一页的页码
nextPage:下一页的页码
isFirstPage/isLastPage:是否为第一页/最后一页
hasPreviousPage/hasNextPage:是否存在上一页/下一页
navigatePages:导航分页的页码数
navigatepageNums:导航分页的页码,[4, 5, 6, 7, 8]

EmpMapper

使用分页插件的mapper只需要按条件查询数据即可,并且不需要为mapper传递limit的参数。
插件会自动为sql语句后拼接 limit。

<!--分页获取员工数据-->
    <select id="getEmps" resultType="Emp">
        select id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time from emp
        <where>
            <if test="name != null and name !='' " >
                name like concat('%',#{name},'%')
            </if>
            <if test="gender != null">
                and gender = #{gender}
            </if>
            <if test="begin != null and end != null" >
                and entrydate between #{begin} and #{end}
            </if>
        </where>
    </select>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JavaParser如何获取方法的返回类型

使用JavaParser 如何获取一个Java类中的某个方法的返回类型呢&#xff1f; 假如有一个如下的简单的Java 类&#xff1a; /*** Copyright (C) Oscar Chen(XM):* * Date: 2024-11-21* Author: XM*/ package com.osxm.ai.sdlc.codeparse.codesample;public class MyClass {public…

2024亚太杯国际赛C题宠物预测1234问完整解题思路代码+成品参考文章

中国宠物业发展趋势及预测模型 一、问题背景与研究目标 近年来&#xff0c;中国宠物业经历了快速发展&#xff0c;特别是在城市化进程加快、人口结构变化和消费水平提升的背景下&#xff0c;宠物作为家庭成员的角色变得愈发重要。根据相关数据&#xff0c;中国宠物数量&#…

Java实现离线身份证号码OCR识别

最近公司要求做离线身份证OCR功能&#xff0c;找了一圈总算是找到了&#xff0c;在这里对文档做个整理&#xff0c;方便后来者&#xff0c;感谢码龄23年博主的分享 系统&#xff1a;Windows11&#xff0c;红旗Linux Asianux8.1 文档中Linux全root用户操作&#xff1b;需先安装…

Gradle核心概念总结

这部分内容主要根据 Gradle 官方文档整理&#xff0c;做了对应的删减&#xff0c;主要保留比较重要的部分&#xff0c;不涉及实战&#xff0c;主要是一些重要概念的介绍。 Gradle 这部分内容属于可选内容&#xff0c;可以根据自身需求决定是否学习&#xff0c;目前国内还是使用…

鸿蒙网络编程系列50-仓颉版TCP回声服务器示例

1. TCP服务端简介 TCP服务端是基于TCP协议构建的一种网络服务模式&#xff0c;它为HTTP&#xff08;超文本传输协议&#xff09;、SMTP&#xff08;简单邮件传输协议&#xff09;等高层协议的应用程序提供了可靠的底层支持。在TCP服务端中&#xff0c;服务器启动后会监听一个或…

第5-1节:SpringBoot对SpringMVC的自动配置

我的后端学习大纲 SpringBoot学习大纲 1、SpringBoot对SpringMVC自动配置概览

Emacs进阶之插入时间信息(一百六十三)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…

嵌入式实验报告:家用计时器

实验目的和要求 1、实验目的 掌握STM32串口通信原理。学习编程实现STM32的UART通信掌握STM32中断程序设计流程。熟悉STM32固件库的基本使用。熟悉STM32定时器中断设计流程。2、实验要求 设计一个家用计时器,其功能如下: 利用串口设置计时时间,格式:XX:XX:X 例如01:59:…

【WRF理论第十二期】Registry.EM 文件详解

【WRF理论第十二期】Registry.EM 文件详解 Registry.EM 文件的作用Registry.EM 文件的结构Registry.EM 文件内容理解如何修改 Registry.EM 文件以输出特定变量WRF-Urban 修改 Registry.EM 文件以输出 UCM 相关变量1. 修改 Registry.EM 文件2. 重新编译 WRF 注意事项参考 在 WRF…

Midjourney 图生图,真人二次元保持一致性,场景多元可选择

Midjourney 拥有强大的图生图的功能&#xff0c;下面我们就来看一下&#xff0c;如何在我们的AceDataCloud网站上实现将照片切换成任意的二次元场景&#xff0c;同时保持人物的一致性。 我们可以按照如下的步骤去实现人物一致性。 下面我们来看看效果吧&#xff0c;原图如下。…

三种复制只有阅读权限的飞书网络文档的方法

大家都知道&#xff0c;飞书是一款功能强大的在线协作工具&#xff0c;可以帮助团队更高效地协作和沟通。越来越多的资料都在使用飞书文档&#xff0c;在使用飞书的过程中&#xff0c;发现很多文档没有复制权限&#xff0c;如果想要摘抄笔记&#xff0c;只能一个字一个字地敲出…

【GL003】TCP/IP 协议

目录 一、TCP/IP协议简介 二、TCP/IP协议的分层模型 2.1 OSI模型的七层框架 2.2 TCP/IP协议层&#xff08;四层&#xff09; 2.2.1 TCP/IP协议层与ISO模型 2.2.2 TCP/IP协议层的作用 三、TCP协议的报文格式 3.1 什么是报文 3.2 TCP报文 四、TCP的通信连接 4.1 TCP…

Spring WebFlux学习笔记(二)

目标 运行第一个spring webflux项目 官网操作 https://start.spring.io/ 依赖、工具 jdk 21、idea、maven 运行过程 将下载的代码直接导入到idea后运行 运行上个笔记的例子 注意 需要更改为MediaType.TEXT_EVENT_STREAM_VALUE 未完待续。。。

【YOLOv8】安卓端部署-2-项目实战

文章目录 1 准备Android项目文件1.1 解压文件1.2 放置ncnn模型文件1.3 放置ncnn和opencv的android文件1.4 修改CMakeLists.txt文件 2 手机连接电脑并编译软件2.1 编译软件2.2 更新配置及布局2.3 编译2.4 连接手机 3 自己数据集训练模型的部署4 参考 1 准备Android项目文件 1.1…

基于CNN-LSTM的时序预测MATLAB实战

卷积神经网络&#xff08;CNN&#xff09;用于提取时间序列数据中的局部空间特征&#xff0c;通过卷积层和池化层的堆叠&#xff0c;CNN能够有效捕获数据中的短期模式和局部依赖关系。长短时记忆网络&#xff08;LSTM&#xff09;用于处理时间序列数据&#xff0c;特别擅长捕捉…

3D可视化产品定制,打造“所见即所得”的购物体验!

在当今数字化时代&#xff0c;3D可视化产品定制正逐步改变着消费者的购物体验与企业的销售模式&#xff0c;相较于大多仍停留在二维层面的线上定制服务&#xff0c;3D可视化产品定制为消费者提供了一个直观、互动且高度个性化的定制功能&#xff0c;并为消费者带来了沉浸式的购…

捉虫记录02-Nacos访问失败

目录 一、问题 二、排查 三、解决方案 一、问题 在访问nacos的时候出现以下问题&#xff1a; 二、排查 先用docker logs nacos来查找报错信息 docker logs nacos 看问题报错就是数据源问题&#xff0c;nacos没能连接上mysql 三、解决方案 第一步 docker restart mysql …

详细教程-Linux上安装单机版的Hadoop

1、上传Hadoop安装包至linux并解压 tar -zxvf hadoop-2.6.0-cdh5.15.2.tar.gz 安装包&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1u59OLTJctKmm9YVWr_F-Cg 提取码&#xff1a;0pfj 2、配置免密码登录 生成秘钥&#xff1a; ssh-keygen -t rsa -P 将秘钥写入认…

桌面怎么快速添加便签?适合桌面记事的便签小工具

在数字化时代&#xff0c;我们每天面对电脑处理大量任务&#xff0c;无论是工作计划、会议纪要还是个人生活琐事&#xff0c;都需要一个可靠的桌面记事工具来帮助我们记录和整理。因此&#xff0c;一款适合桌面使用的便签软件成为了我们不可或缺的助手。 敬业签就是这样一款功…

Django实现智能问答助手-基础配置

设置 Django 项目、创建应用、定义模型和视图、实现问答逻辑&#xff0c;并设计用户界面。下面是一步一步的简要说明&#xff1a; 目录&#xff1a; QnAAssistant/ # 项目目录 │ ├── QnAAssistant/ # 项目文件夹 │ ├── init.py # 空文件 │ ├── settings.py # 项目配…