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~
希望以上的分享能帮到你~
如果以上有错误的地方,希望大家能够指正 ~ 谢谢 ~
如果你有更好的方法,那就赶紧留言分享噢 ~ 谢谢 ~