开发中要用到分页工功能时,有个很好用的myBatis插件:
PageHelper
网上看到的引入步骤很简单,只需两步即可:
- 引入PageHelper相关依赖
<!-- 分页插件-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>4.1.0</version>
</dependency>
- 在需要分页的地方调用:
注意:
PageHelper.startPage(pageNum,pageSize);
该代码会对下一个查询语句进行分页,故要分页的查询方法必须是该代码后的第一个查询方法。
//调用插件方法
PageHelper.startPage(pageNum,pageSize);
List list = xxxMapper.selectAll();
//此时的list即为已经分页处理后的集合
//要获取更多分页详细信息
PageInfo pageInfo = new PageInfo(list);
pageInfo.getPageNum();
pageInfo.getPageSize();
pageInfo.getTotal();
在第一个项目中用的很好,But在第二个项目里面,跟第一个的引入方式用法完全相同,但是查询的结果始终是全量的,就是说分页没有起到作用,于是乎,上网百度,网上找到的有如下几种情况:
- jar包引入的不对
有的说在SpringBoot2.0以上的版本,依赖引入方式不能只引入
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>4.1.0</version>
</dependency>
还需要引入
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.3</version>
</dependency>
我是两个包一起引入的,但是没有用。
- PageHelper调用位置不对
PageHelper.startPage(pageNum,pageSize);要和要分页的查询语句挨着且在查询语句之前。
这点我满足了,可还是不行。 - 数据源配置
在使用SpringBoot时,我用的是自定义实例化多数据源SqlSessionFactoryBean,就需要在定义数据源的代码中做如下配置
//mybatis分页
PageHelper pageHelper = new PageHelper();
Properties props = new Properties();
props.setProperty("dialect", "mysql");
props.setProperty("reasonable", "true");
props.setProperty("supportMethodsArguments", "true");
props.setProperty("returnPageInfo", "check");
props.setProperty("params", "count=countSql");
pageHelper.setProperties(props); //添加插件
sqlSessionFactory.setPlugins(new Interceptor[]{pageHelper});
我的问题是通过这种方式解决的。
采坑记录:
之前引入PageHelper的版本过高导致代码:
sqlSessionFactory.setPlugins(new Interceptor[]{pageHelper});
一直报如下类型转化异常:
后面改了4.多的版本解决了,后面又发现一种方式应该也可以,还没有尝试:
Properties properties = new Properties();
//properties.setProperty("helperDialect", "mysql");
properties.setProperty("reasonable", "true");
properties.setProperty("supportMethodsArguments", "true");
properties.setProperty("pageSizeZero", "true");
//pageHelper.setProperties(properties);
PageInterceptor interceptor = new PageInterceptor();
interceptor.setProperties(properties);
sqlSessionFactoryBean.setPlugins(new Interceptor[]{interceptor});