前言
pageHelper是一款优秀的Mybatis分页插件,在项目中可以非常便利的使用,使开发效率得到很大的提升,但不支持一对多结果映射的分页查询,所以在平时的使用时,对于一对多分页会出现分页错误,这篇文章主要对pageHelper分页错误进行重现以及提出解决方案。
分析
mybatis进行一对多查询时,映射文件(mapper.xml)中的sql语句中使用的左连接,pageHelper会自动对这条左连接sql语句进行select count(0)的处理,并把结果作为分页结构的记录总数,然后自动将limit拼接到sql语句末尾进行分页,由于左连接查询时,连接条件on条件不唯一(即一对多)时,结果会产生笛卡尔积,所以经过pagehelper插件分页得到的记录总数和分页结果并不是预期的结果
前言转自:【菜鸟阿都】
错误原因
- 第一种:
依赖引入错误,
我的错误依赖
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.3.0</version>
</dependency>
尽量多尝试几个版本
修改正确依赖(这里尽量去maven仓库去用最新而稳定的版本
)maven仓库跳转
<!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper-spring-boot-starter -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
再者记得加配置文件
#pagehelper分页配置
pagehelper:
helperDialect: mysql #分页插件会自动检测当前的数据库链接,自动选择合适的分页方式。
reasonable: true #分页合理化参数,默认值为false。
supportMethodsArguments: true #支持通过 Mapper 接口参数来传递分页参数,默认值false
params: count=countSql #增加了该参数来配置参数映射,用于从对象中根据属性名取值。
- 第二种:
代码查询问题,可参考思否
在Controller的方法中
PageHelper.startPage(1,5);//从第一页开始,每页5条记录
以上代码后面需紧跟查询语句
List<Test> tests = testService.getAllTestsByTypeId(testTypeid);
PageInfo pageInfo = new PageInfo(tests,5);
当一个方法中有多个查询语句时,只有紧跟在PageHelper.starPage()方法后的查询结果才会分页。
缺少以上三步都会导致分页失效
-
第三种:对于一对多的查询,最好使用标签子查询的方式,不然分页也会失败
看一下一对多正确的使用姿势 -
第四种:千万
不要
在每一页中的数据进行筛选或者添加
操作,但是可以
去对每页的对象进行属性的封装,千万不要去删除和添加每页的数据。 -
总之:
1、第二种错误就是在PageHelper.startPage(1,5)后紧跟的查询语句有效,后面再加查询语句就没有用
2、对分页的数据千万不要增加和删除,都把增加和删除这些操作多放在sql中去完成,这样就不会失效