0


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

1.分页概念

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

2.原生写法

步骤:

controller层:

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

service层:

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

mapper层:

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

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

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

  1. package com.its.domain;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Data;
  4. import lombok.NoArgsConstructor;
  5. import java.util.List;
  6. @Data
  7. @AllArgsConstructor
  8. @NoArgsConstructor
  9. public class PageResult {
  10. private Object data;
  11. private Long total;
  12. }

案例测试

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

controller层方法

  1. package com.its.controller;
  2. import com.its.domain.PageResult;
  3. import com.its.domain.Result;
  4. import com.its.domain.Room;
  5. import com.its.service.TestService;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.web.bind.annotation.PostMapping;
  8. import org.springframework.web.bind.annotation.RestController;
  9. @RestController
  10. public class TestController {
  11. @PostMapping("/selectAllRoom")
  12. public Result selectAllRoom(Room room, Integer pageNo, Integer pageSize){
  13. // 1.接受请求,请求数据为 页码数+每页的数量+查询的条件
  14. return testService.selectAllRoom(room,pageNo,pageSize);
  15. }
  16. }

service层代码

  1. package com.its.service.Impl;
  2. import com.github.pagehelper.Page;
  3. import com.github.pagehelper.PageHelper;
  4. import com.its.domain.PageResult;
  5. import com.its.domain.Result;
  6. import com.its.domain.Room;
  7. import com.its.mapper.TestMapper;
  8. import com.its.service.TestService;
  9. import org.springframework.beans.factory.annotation.Autowired;
  10. import org.springframework.stereotype.Service;
  11. import java.util.List;
  12. @Service
  13. public class TestServiceImpl implements TestService {
  14. @Override
  15. public Result selectAllRoom(Room room, Integer pageNo, Integer pageSize) {
  16. // 将页码数换算成行数
  17. int pageStart = (pageNo-1)*pageSize;
  18. // 调用mapper层完成分页查询
  19. List<Room> rooms = testMapper.selectAllRoom(room, pageStart, pageSize);
  20. // 再查询总数量
  21. long total = testMapper.selectTotal(room);
  22. // 封装成对象返回
  23. Result result = new Result(rooms, total);
  24. return result;
  25. }
  26. }

mapper

  1. package com.its.mapper;
  2. import com.its.domain.PageResult;
  3. import com.its.domain.Room;
  4. import org.apache.ibatis.annotations.Mapper;
  5. import org.apache.ibatis.annotations.Param;
  6. import java.util.List;
  7. @Mapper
  8. public interface TestMapper {
  9. // 原生分页查询
  10. List<Room> selectAllRoom(@Param("room") Room room,
  11. @Param("pageStart") Integer pageStart,
  12. @Param("pageSize") Integer pageSize);
  13. int selectTotal(@Param("room") Room room);
  14. }

xml映射SQL文件

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.its.mapper.TestMapper">
  6. //分页查询符合条件的数据
  7. <select id="selectAllRoom" resultType="com.its.domain.Room">
  8. select * from room
  9. <where>
  10. <if test="room.info!=null and room.info!=''">
  11. info like concat('%',#{room.info},'%')
  12. </if>
  13. </where>
  14. limit #{pageStart},#{pageSize}
  15. </select>
  16. //查询总数量
  17. <select id="selectTotal" resultType="java.lang.Integer">
  18. select count(1) from room
  19. <where>
  20. <if test="room.info!=null and room.info!=''">
  21. info like concat('%',#{room.info},'%')
  22. </if>
  23. </where>
  24. </select>
  25. </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所需依赖

  1. <!--分页插件依赖-->
  2. <dependency>
  3. <groupId>com.github.pagehelper</groupId>
  4. <artifactId>pagehelper-spring-boot-starter</artifactId>
  5. <version>1.4.7</version>
  6. </dependency>

(2)controller层

  1. package com.its.controller;
  2. import com.its.domain.PageResult;
  3. import com.its.domain.Result;
  4. import com.its.domain.Room;
  5. import com.its.service.TestService;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.web.bind.annotation.PostMapping;
  8. import org.springframework.web.bind.annotation.RestController;
  9. @RestController
  10. public class TestController {
  11. @Autowired
  12. TestService testService;
  13. @PostMapping("/selectAll")
  14. //参数为查询条件,页数,每页的展示数
  15. public PageResult selectAll(Room room,Integer pageNo,Integer pageSize){
  16. PageResult pageResult = testService.selectAll(room, pageNo, pageSize);
  17. return pageResult;
  18. }
  19. }

(3)service层

  1. package com.its.service.Impl;
  2. import com.github.pagehelper.Page;
  3. import com.github.pagehelper.PageHelper;
  4. import com.its.domain.PageResult;
  5. import com.its.domain.Result;
  6. import com.its.domain.Room;
  7. import com.its.mapper.TestMapper;
  8. import com.its.service.TestService;
  9. import org.springframework.beans.factory.annotation.Autowired;
  10. import org.springframework.stereotype.Service;
  11. import java.util.List;
  12. @Service
  13. public class TestServiceImpl implements TestService {
  14. @Autowired
  15. TestMapper testMapper;
  16. @Override
  17. public PageResult selectAll(Room room, Integer pageNo, Integer pageSize) {
  18. // 开启分页查询,当执行查询时,插件进行相关的sql拦截进行分页操作,返回一个page对象
  19. Page<Room> page = PageHelper.startPage(pageNo, pageSize);
  20. // 调用mapper层完成查询
  21. testMapper.selectAll(room);
  22. // 封装结果
  23. PageResult pageResult = new PageResult(page.getResult(), page.getEndRow());
  24. System.out.println(pageResult);
  25. System.out.println(page);
  26. return pageResult;
  27. }
  28. }

(4)mapper层

  1. package com.its.mapper;
  2. import com.its.domain.PageResult;
  3. import com.its.domain.Room;
  4. import org.apache.ibatis.annotations.Mapper;
  5. import org.apache.ibatis.annotations.Param;
  6. import java.util.List;
  7. @Mapper
  8. public interface TestMapper {
  9. // 使用分页插件分页查询
  10. List<Room> selectAll(@Param("room") Room room);
  11. }

(5)xml映射文件

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

(6)测试结果:

3.3 Page对象和PageInf对象

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

Page对象

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

PageInfo对象

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

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

标签: SpringBoot java 后端

本文转载自: https://blog.csdn.net/qq_62555748/article/details/141144654
版权归原作者 空谷忧人 所有, 如有侵权,请联系我们删除。

“【SpringBoot】SpringBoot中分页插件(PageHelper)的使用”的评论:

还没有评论