原因分析
做项目时发现导入分页插件的场景启动器后,分页插件不生效,一直查询出所有数据
上网搜索发现分页插件不生效主要有以下原因:
1、没有导入分页插件的场景启动器,而是导入了普通的分页插件依赖
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.10</version>
</dependency>
导入该依赖后还需要进行额外的配置
1). 在 MyBatis 配置 xml 中配置拦截器插件
<!--
plugins在配置文件中的位置必须符合要求,否则会报错,顺序如下:
properties?, settings?,
typeAliases?, typeHandlers?,
objectFactory?,objectWrapperFactory?,
plugins?,
environments?, databaseIdProvider?, mappers?
-->
<plugins>
<!-- com.github.pagehelper为PageHelper类所在包名 -->
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<!-- 使用下面的方式配置参数-->
<property name="param1" value="value1"/>
</plugin>
</plugins>
2). 在 Spring 配置文件中配置拦截器插件
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 注意其他配置 -->
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageInterceptor">
<property name="properties">
<!--使用下面的方式配置参数,一行配置一个 -->
<value>
params=value1
</value>
</property>
</bean>
</array>
</property>
</bean>
3). 在配置类中进行配置
@Configuration
public class PageHelperConfig {
@Bean
public Interceptor[] plugins() {
return new Interceptor[]{new PageInterceptor()};
}
}
一开始我是这么配置的,但是它会报错:
java.lang.NullPointerException: Cannot invoke "com.github.pagehelper.Dialect.afterAll()" because "this.dialect" is null
at com.github.pagehelper.PageInterceptor.intercept(PageInterceptor.java:147)
at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:62)
at jdk.proxy2/jdk.proxy2.$Proxy121.query(Unknown Source)
而且我导入的是分页插件的场景启动器,按理说不需要再进行额外的配置
2、先执行了查询然后再设置的分页
//错误写法
// 要设置分页的查询
List<Map<String, Object>> data = aService.listMaps();
// 设置分页
PageHelper.startPage(1, 10);
//正确写法
// 设置分页
PageHelper.startPage(1, 10);
// 要设置分页的查询
List<Map<String, Object>> data = aService.listMaps();
3、在开启分页与分页查询语句之间穿插了其他的查询语句
// 设置分页
PageHelper.startPage(1, 10);
// 其他查询
Integer id = anotherService.getById(1046).getId();
// 要设置分页的查询
List<Map<String, Object>> data = aService.listMaps();
经检查,我写的代码没有问题,于是我又去访问了pagehelper的官网,以及它的官网教程
官网网址
分页插件官网
分页插件官网教程
访问完后依然没有发现问题
问题解决
于是我在想是不是版本的问题
我在项目中使用的springboot版本是3.0.5,mybatis-starter版本是3.0.1,
pagehelper-starter版本是1.2.5
经查, pagehelper-starter1.2.5发行日期是: Apr 22, 2018
而springboot3.0.5发行日期是:Mar 23, 2023
于是我将pagehelper-starter版本换成了1.4.6,问题解决