SpringBoot-集成PageHelper分页插件

485 阅读2分钟

本文主要讲述 SpringBoot 集成 PageHelper 分页插件的具体步骤和分页常规用法。

项目环境:

  • SpringBoot 2.0.6.RELEASE
  • jdk1.8

添加依赖

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.3.1</version>
    <!--
        使用 springboot2 整合 pagehelper-spring-boot-starter 必须排除一下依赖
        因为pagehelper-spring-boot-starter也已经在pom依赖了mybatis与mybatis-spring
        所以会与 mybatis-plus-boot-starter 中的 mybatis 与 mybatis-spring 发生冲突
    -->
    <exclusions>
        <exclusion>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
        </exclusion>
    </exclusions>
</dependency>

这里有个坑,我之前直接导入的依赖是pagehelper依赖(如下),在与mybatis-plus集成时,虽然不报错但是分页没有成功。换成pagehelper-spring-boot-starter依赖就可以了。但是mybatis-plus自带的分页和pagehelper分页也可能发生冲突。需要排除下冲突依赖。

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.1.4</version> 
</dependency>

参考文章

分页参数配置

application.yml配置
以下只配置了常用的几个参数,官方文档提供了很多参数,想要具体了解请详读官网。

# 分页配置参数
pagehelper:
  # 默认值false,当值为true时,pageSize=0或者RowBounds.limit=0查询全部结果(相当于没有执行分页查询,但是返回结果仍然是Page类型)
  page-size-zero: true
  # 分页插件会自动检测当前的数据库链接,自动选择合适的分页方式。也可以指定分页插件使用哪种方言。
  helper-dialect: mysql
  # 分页合理化参数,默认值为false。当值为true时,pageNum<=0 时会查询第一页,pageNum>pages(超过总数时),会查询最后一页。默认false时,直接根据参数进行查询。
  reasonable: true
  # 支持通过Mapper接口参数来传递分页参数,默认值false,分页插件会从查询方法的参数值中,自动根据上面 params 配置的字段中取值,查找到合适的值时就会自动分页。
  support-methods-arguments: true
  # 为了支持 startPage(Object params) 方法,增加了该参数来配置参数映射,用于从对象中根据属性名取值,可以配置 pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值
  params: count=countSql

实现分页

在你需要进行分页的 MyBatis 查询方法前调用 PageHelper.startPage 静态方法即可实现分页。

/**
 * 用户分页列表
 * @param pageNum 当前页数
 * @param pageSize 每页条数
 * @return 分页结果
 */
@GetMapping("/page")
public Object page(@RequestParam int pageNum,@RequestParam int pageSize){
    //分页
    PageHelper.startPage(pageNum, pageSize);
    //紧跟着的第一个select方法会被分页
    List<User> users = userService.getUserList();
    //封装分页结果
    PageInfo<User> pageInfos = new PageInfo<>(users);
    return pageInfos;
}

返回结果:

image.png

{
    "total": 8,
    "list": [
        {
            "userId": 2,
            "userName": "阿彪呢",
            "userAge": 25
        },
        {
            "userId": 3,
            "userName": "阿军",
            "userAge": 25
        },
        {
            "userId": 4,
            "userName": "阿龙",
            "userAge": 28
        },
        {
            "userId": 5,
            "userName": "保先",
            "userAge": 26
        },
        {
            "userId": 6,
            "userName": "阿静",
            "userAge": 4
        }
    ],
    "pageNum": 1,
    "pageSize": 5,
    "size": 5,
    "startRow": 1,
    "endRow": 5,
    "pages": 2,
    "prePage": 0,
    "nextPage": 2,
    "isFirstPage": true,
    "isLastPage": false,
    "hasPreviousPage": false,
    "hasNextPage": true,
    "navigatePages": 8,
    "navigatepageNums": [
        1,
        2
    ],
    "navigateFirstPage": 1,
    "navigateLastPage": 2
}

分页结果参数说明:

pageNum:当前页
pageSize:每页的数量
size:当前页的数量
startRow:当前页面第一个元素在数据库中的行号
endRow:当前页面最后一个元素在数据库中的行号
pages:总页数
prePage:上一页
nextPage:下一页
isFirstPage:是否为第一页
isLastPage:是否为最后一页
hasPreviousPage:是否有上一页
hasNextPage:是否有下一页
navigatePages:导航页码数
navigatepageNums:所有导航页号
navigateFirstPage:导航条上的第一页
navigateLastPage:导航条上的最后一页
total:总记录数
list:分页结果集

注意: 紧跟在PageHelper.startPage方法后的第一个MyBatis 查询方法才会被进行分页。

image.png

进阶用法

实际上很多业务场景中,我们需要同时实现分页接口与对应不分页的接口。
代码如下:
doSelectPage方法返回Page对象,doSelectPageInfo方法返回PageInfo对象。省去了前文单独封装分页结果的过程。

/**
 * 用户分页列表
 * @param pageNum 页码
 * @param pageSize 每页条数
 * @return 分页结果
 */
@GetMapping("/page")
public Object page(@RequestParam int pageNum,@RequestParam int pageSize){
    //jdk8 lambda用法
    PageInfo<User> pageInfos = PageHelper.startPage(pageNum, pageSize).doSelectPageInfo(() -> list());
    return pageInfos;
}

/**
 * 用户列表
 * @return 用户列表
 */
@GetMapping("/list")
public Object list(){
    return userService.getUserList();
}

至此,SpringBoot集成PageHelper就完成了。
更多的用法与细节,请参考官网:PageHelper官网文档


(完)

纸上得来终觉浅,绝知此事要躬行。