SpringBoot+MyBatis使用pagehelper分页插件及其注意事项(含解决分页不生效问题)

1 前言

近期在做项目的时候,遇到了一个问题:在使用MyBatis的分页插件(pagehelper)时,发现其分页不生效,找了许多方法才得以解决,故写下这篇文章记录一下,帮助跟我遇到同样问题的同学~

2 项目背景

本人项目使用的是 SpringBoot 框架,具体 POM.xml 文件关键依赖引入如下:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.10.RELEASE</version>
    <relativePath/>
</parent>

MyBatis 用的是与 SpringBoot 的整合包,方便快捷,依赖如下:

<dependencies>
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.1.1</version>
    </dependency>
</dependencies>

分页功能,我引入的 MyBatis 的分页插件 PageHelper ,依赖如下:

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

此处之所以引入的是 pagehelper-spring-boot-starter,同样是为了便于跟 SpringBoot 融合,自动配置,减少使用负担。

3 引入 PageHelper 注意要点

3.1 检查引入的包是否正确

建议使用 SpringBoot 框架的同学,都引入 pagehelper 与 SpringBoot 项目的整合包,避免不必要冲突影响插件的使用。

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

3.2 检查在代码中使用是否正确

一般我们代码中常用以下方式来设置分页情况,正确的关键代码如下:

/**
* @author pjy
* @date 2021/7/29
* @param pageNumber    页码
* @param pageSize      每页显示数目
*/
public PageInfo<UserRole> list(Integer pageNumber, Integer pageSize, String userId) {

    // 查询用户信息
    User user = userService.findById(userId);

    // 设置分页
    PageHelper.startPage(pageNumber, pageSize);

    // 查询用户角色列表(需要分页的查询)
    List<UserRole> list = userRoleService.queryList();
    PageInfo<UserRole> pageInfo = new PageInfo<UserRole>(list);

    return pageInfo;
)

值得注意的是,PageHelper.startPage(页码, 每页显示数目);  这一句代码,必须放在需要分页的查询语句之前,否则会分页不生效。

我总结了以下常见的情况,均会导致分页不生效,请同学们检查下是否存在以下情况:

3.2.1 分页失效情况一:分页设置与需要分页的查询之间存在其他查询

如下代码是一个错误示范,虽然在方法的开头设置了分页,但因为在【查询用户角色列表】之前,多查了一步【查询用户信息】,此时实际上分页针对的是【查询用户信息】进行分页,而并非对【查询用户角色列表】进行分页。

/**
* 错误示范
* 
* @author pjy
* @date 2021/7/29
* @param pageNumber    页码
* @param pageSize      每页显示数目
*/
public PageInfo<UserRole> list(Integer pageNumber, Integer pageSize, String userId) {
    // 设置分页
    PageHelper.startPage(pageNumber, pageSize);

    // 查询用户信息
    User user = userService.findById(userId);

    // 查询用户角色列表(需要分页的查询)
    List<UserRole> list = userRoleService.queryList();
    PageInfo<UserRole> pageInfo = new PageInfo<UserRole>(list);

    return pageInfo;
)

3.2.2 分页失效情况二:在需要分页的查询后才设置分页

如下代码是一个错误示范,在【查询用户角色列表】后才进行分页设置,因为已进行的所有数据的查询,所以此时再设置分页已无任何意义,自然会分页失效。

/**
* 错误示范
* 
* @author pjy
* @date 2021/7/29
* @param pageNumber    页码
* @param pageSize      每页显示数目
*/
public PageInfo<UserRole> list(Integer pageNumber, Integer pageSize, String userId) {

    // 查询用户信息
    User user = userService.findById(userId);

    // 查询用户角色列表(需要分页的查询)
    List<UserRole> list = userRoleService.queryList();

    // 设置分页
    PageHelper.startPage(pageNumber, pageSize);
    PageInfo<UserRole> pageInfo = new PageInfo<UserRole>(list);

    return pageInfo;
)

3.3 pageHelper 配置

正常来说引入了 pagehelper-spring-boot-starter 包是不需要再单独进行配置了,但考虑到在实际特殊场景中默认配置不满足业务需求,此时则需要针对 pageHelper 进行特殊配置。

关于 pageHelper 的配置方式我这里大概介绍 2 种:

3.3.1 使用 application.yml 配置

pagehelper:
  # 设置方言,此处指定 MySQL 数据库
  helper-dialect: mysql
  # 是否启动合理化,默认是 false。
  # 启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages(最大页数)会查询最后一页。
  # 禁用合理化时,如果pageNum<1或pageNum>pages会返回空数据
  reasonable: true
  # 是否支持接口参数来传递分页参数,默认false
  support-methods-arguments: true
  # 为了支持startPage(Object params)方法,增加了该参数来配置参数映射,用于从对象中根据属性名取值
  params: count=countSql
  # 默认值为 false,当该参数设置为 true 时,如果 pageSize=0 或者 RowBounds.limit = 0 就会查询出全部的结果(相当于没有执行分页查询,但是返回结果仍然是 Page 类型)
  page-size-zero: true

 3.3.2 使用 Java 代码配置

/**
 * PageHelper 分页配置
 *
 * @author pjy
 * @date 2021年07月29日
 */
@Configuration
public class PageHelperConfigure {
    @Bean
    public PageHelper pageHelper() {
        PageHelper pageHelper = new PageHelper();
        Properties p = new Properties();
        p.setProperty("offsetAsPageNum", "true");
        p.setProperty("rowBoundsWithCount", "true");
        p.setProperty("reasonable", "true");
        pageHelper.setProperties(p);
        return pageHelper;
    }
}

说明:

以上配置仅展示了其中一小部分,更多详情可参考 pagehelper 官方文档

那么如果你看到这里已经能成功使用 pageHelper 进行分页,那么恭喜你,下面的内容已经不需要看了,继续开发吧!加油~ 同学们~


4 其他

看到这里的同学,可能是已经试过千万种方法都解决不了这个分页失效问题,不慌,在确定文章上面内容你都准确无误之后,试试下面这种。

使用 Java 代码配置增加一个 分页拦截器,具体代码如下:

/**
 * PageHelper 分页配置
 *
 * @author pjy
 * @date 2021年07月29日
 */
@Configuration
public class PageHelperConfigure {

    @Bean
    public Interceptor[] plugins() {
        return new Interceptor[]{new PageInterceptor()};
    }
}

重启项目,完美解决分页问题~ yeah~


希望以上的分享能帮到你~

如果以上有错误的地方,希望大家能够指正 ~ 谢谢 ~
如果你有更好的方法,那就赶紧留言分享噢 ~ 谢谢 ~

猜你喜欢

转载自blog.csdn.net/pjymyself/article/details/119203900