背景
项目中讨厌的前段让做分页,感觉自己好久没写过这么基础的crud了。但是出于负责人的角度考虑,我还是偷懒的使用分页插件了。
集成
分页插件对于springboot有两个可供选择
<!--版本一-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.11</version>
</dependency>
<!--版本二-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.13</version>
</dependency>
当然 pagehelper-spring-boot-starter
是pagehelper
的springboot封装版,相对它更多的配置都已经弄好了
使用起来更方便,两个选一个就好
集成后报错
Caused by: org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: java.lang.RuntimeException: 在系统中发现了多个分页插件,请检查系统配置!
### Cause: java.lang.RuntimeException: 在系统中发现了多个分页插件,请检查系统配置!
at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:150)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:433)
... 93 more
Caused by: java.lang.RuntimeException: 在系统中发现了多个分页插件,请检查系统配置!
at com.github.pagehelper.PageHelper.skip(PageHelper.java:56)
at com.github.pagehelper.PageInterceptor.intercept(PageInterceptor.java:93)
at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)
at com.sun.proxy.$Proxy258.query(Unknown Source)
at com.github.pagehelper.util.ExecutorUtil.executeAutoCount(ExecutorUtil.java:138)
at com.github.pagehelper.PageInterceptor.count(PageInterceptor.java:150)
at com.github.pagehelper.PageInterceptor.intercept(PageInterceptor.java:97)
at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)
at com.sun.proxy.$Proxy258.query(Unknown Source)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:148)
... 99 more
一下子我就不开心了
解决方案和分析
/**
* 配置session工厂
*
* @return
* @throws Exception
*/
@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
final SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource());
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath*:mybatis/*/*Mapper.xml"));
// PageInterceptor pageInterceptor = new PageInterceptor();
// Properties properties = new Properties();
// properties.setProperty("helperDialect", "oracle");
// properties.setProperty("reasonable", "true");
// properties.setProperty("supportMethodsArguments", "true");
// properties.setProperty("params", "pageNum=pageNum;pageSize=pageSize");
// pageInterceptor.setProperties(properties);
// sqlSessionFactoryBean.setPlugins(new Interceptor[]{
pageInterceptor});
return sqlSessionFactoryBean.getObject();
}
根据源码分析可得, pagehelper-spring-boot-starter
已经帮我们自动封装了一个PageInterceptor所以自己创建的这个就和那个冲突了,这段就相当于画蛇添足,注释掉即可。
PS:
1.当然如果你用的是这个的话pagehelper
,一定要自己配置拦截器,否则Pagehelper无法使用
2. PageHelper.startPage(pageNum, pageSize); 仅对接下来第一个数据库查询生效哦
END