前言
项目启动初期,在集成mybatis的分页插件,自定义封装了一个分页的工具类,方便后期项目的扩展。部分的代码如下:
/**
* 分页查询
* 进行count计算
*
* @param pageNum 页数
* @param pageSize 每页数量
* @param supplier 查询操作
* @return
*/
public static <T> PageInfo<T> pageQueryWithCount(int pageNum, int pageSize, Supplier<List<T>> supplier) {
if (pageNum < 1) pageNum = getDefaultPageNum();
if (pageSize < 1) pageSize = getDefaultPageSize();
try {
Page<T> page = PageHelper.startPage(pageNum, pageSize, true);
supplier.get();
return new PageInfo<T>(page);
} finally {
PageHelper.clearPage();
}
}
问题
结果懵逼了,无法分页了。怎么设置搞都没办法正常分页,把我脑子搞晕乎了哎呀。
分析
- 发现问题
找了很久,一直不明白为什么会无法进行分页。对PageHelper进行了封装,然后直接调用的工具类的代码。我的代码如下:
PageInfo<SysUserDO> sysUserDOPageInfo = PageUtils.pageQueryWithCount(pageNum, pageSize, () ->
sysUserDao.get()
);
GenericPageRspBO genericPageRspBO = new GenericPageRspBO();
genericPageRspBO.setTotal(sysUserDOPageInfo.getTotal());
genericPageRspBO.setResultList(BeanCopyUtils.deepCopyBeanList(sysUserDOPageInfo.getList(), SysUserBO.class));
return genericPageRspBO;
- 分析问题
为什么会出现这样的问题呢,在网上找了很久,但是没有找到对应的解决方案。因为项目是springboot工程,项目管理方面跟spring是有差异的,就像昨天对ApplicationContextAware做封装一样,需要使用@Component管理bean是一个道理。可能是maven依赖的问题导致的我的分页插件失效了。一开始使用的maven依赖
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.11</version>
</dependency>
- 解决问题
- 为了验证我的猜想,我先把代码单独的拎出来打断点跑一下。代码如下:
PageHelper.startPage(1,5);
List<SysUserDO> sysUserDOS = sysUserDao.get();
PageInfo<SysUserDO> sysUserDOPageInfo = new PageInfo<>(sysUserDOS);
- 结果正如所料,打了断点看代码,并没有成功的进行分页。设置了分页参数,但是查询了12条数据。
- 果然,把代码抽出来看一下就知道究竟是我的工具类封装有问题还是分页插件的问题。找到了问题接下来就顺畅很多了。我先替换了maven的依赖,使用springboot工程版本。maven依赖如下:
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.1</version>
</dependency>
- 这次打断点一看,分页成功了。
总结
做人做到底,送佛送到西。今天踩了一个坑。对PageHelper 分页失效的问题进行一下汇总。
-
PageHelper未正确配置: 请确保你的PageHelper配置在Spring Boot的配置文件中已经生效。你的配置看起来正确,但需要确保配置文件的位置和名称与Spring Boot的要求一致(通常是application.yml或application.properties)。
-
PageHelper版本问题: 有时候,PageHelper的版本与MyBatis或Spring Boot版本不兼容可能导致问题。请确保你正在使用兼容的版本。
-
注意pom.xml导入的依赖:应该是spring版本的而不是其独立的版本
-
SQL查询是否正确: 最后,请确保你的SQL查询在数据库中是有效的,且返回了正确的结果。你可以在数据库中手动运行查询来验证它是否按预期工作。
-
只有紧跟着PageHelper.startPage()的sql语句才被pagehelper起作用。(注意,经过再次验证,这里不是扯淡,其原理可能是
“PageHelper.startPage(pageNum,pageSize)”在使用的时候启动了一个线程,致使了其能达到这个效果”)