SpringBoot中分页插件PageHelper的使用详解

 更新时间:2024年09月17日 11:19:49   作者:空谷忧人  
分页查询是为了高效展示大量数据,通过分页将数据划分为多个部分逐页展示,原生方法需手动计算数据起始行,而使用PageHelper插件则简化这一过程,本文给大家介绍SpringBoot中分页插件PageHelper的使用,感兴趣的朋友一起看看吧

1.分页概念

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

2.原生写法

步骤:

controller层:

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

service层:

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

mapper层:

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

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

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

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.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);
}

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 mapper
        PUBLIC "-//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层(不变):

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

service层:

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

mapper层:

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

【原理介绍】

  • 会给查询的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 {
    @Autowired
    TestService 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 {
    @Autowired
    TestMapper testMapper;
    @Override
    public 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 mapper
        PUBLIC "-//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进行上面的替换,业务层代码为

到此这篇关于SpringBoot中分页插件(PageHelper)的使用的文章就介绍到这了,更多相关SpringBoot分页插件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • J2SE基础之在Eclipse中运行hello world

    J2SE基础之在Eclipse中运行hello world

    本文的内容非常的简单,跟随世界潮流,第一个Java程序输出“Hell World!”。希望大家能够喜欢
    2016-05-05
  • JAVA解决在@autowired,@Resource注入为null的情况

    JAVA解决在@autowired,@Resource注入为null的情况

    这篇文章主要介绍了JAVA解决在@autowired,@Resource注入为null的情况,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • mybatis plus怎么忽略映射字段

    mybatis plus怎么忽略映射字段

    这篇文章主要介绍了mybatis plus怎么忽略映射字段,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • Maven中的库repository详解

    Maven中的库repository详解

    Maven中要配置库,可以有多种方式,最直接的是在项目中的pom.xml文件中,通过<repositories>配置库,这样配置的库仅适用于当前项目,这篇文章主要介绍了Maven中的库(repository),需要的朋友可以参考下
    2024-01-01
  • 关于Mysql的四种存储引擎

    关于Mysql的四种存储引擎

    这篇文章主要介绍了关于Mysql的四种存储引擎,MySql的核心就是存储引擎,不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以 获得特定的功能,需要的朋友可以参考下
    2023-05-05
  • springboot+redis实现简单的热搜功能

    springboot+redis实现简单的热搜功能

    这篇文章主要介绍了springboot+redis实现一个简单的热搜功能,通过代码介绍了过滤不雅文字的过滤器,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • springboot 接口返回字符串带引号的问题解决

    springboot 接口返回字符串带引号的问题解决

    本文主要介绍了springboot 接口返回字符串带引号的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • Java 数组的两种初始化方式

    Java 数组的两种初始化方式

    这篇文章主要介绍了Java 数组的两种初始化方式,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下
    2021-02-02
  • java的多线程高并发详解

    java的多线程高并发详解

    这篇文章主要介绍了java的多线程高并发详解,文中有非常详细的代码示例,对正在学习java的小伙伴们有很好地帮助,需要的朋友可以参考下
    2021-04-04
  • SpringBoot加载读取配置文件过程详细分析

    SpringBoot加载读取配置文件过程详细分析

    在实际的项目开发过程中,我们经常需要将某些变量从代码里面抽离出来,放在配置文件里面,以便更加统一、灵活的管理服务配置信息。所以本文将为大家总结一下SpringBoot加载配置文件的常用方式,需要的可以参考一下
    2023-01-01

最新评论