最近项目中有用到Mybatis的PageHelper分页插件,记录一下插件集成方法和一些坑。
1、引入PageHelper依赖
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>4.1.6</version>
</dependency>
2、在MyBatisConfig配置文件中添加分页插件
/**
* @description MyBatis配置
* @author zhangzhixiang
*/
@Configuration
@EnableTransactionManagement
public class MyBatisConfig implements TransactionManagementConfigurer {
@Autowired
DataSource dataSource;
@Bean(name = "sqlSessionFactory")
@Primary //在同样的SqlSessionFactory中,首先使用被标注的SqlSessionFactory,将覆盖其他来源的SqlSessionFactory
public SqlSessionFactory sqlSessionFactoryBean() {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
//设置数据源
bean.setDataSource(dataSource);
//设置别名
String packageName = "com.cy.ewc.dal.*.model";
bean.setTypeAliasesPackage(packageName);
//设置分页插件
PageInterceptor pageInterceptor = new PageInterceptor();
Properties properties = new Properties();
properties.setProperty("dialect", "com.github.pagehelper.dialect.helper.MySqlDialect");//如果不加这一行也能出来分页效果,但是统计重来的total是本页总数。不是查询总记录数
properties.setProperty("reasonable", "false");//默认是true,如果不设置为false,分页的时候如果翻到没有数据的页数的时候,返回最后有数据的那一页
properties.setProperty("helperDialect", "mysql");//设置数据库方言为mysql
properties.setProperty("supportMethodsArguments", "true");//支持通过Mapper接口参数来传递分页参数 ,默认是false,开启之后可以支持在DAO接口传入pageSize和pageNum自动分页,或者可定义到接口参数传入实体中自动分页
properties.setProperty("returnPageInfo", "check");//always总是返回PageInfo类型,check检查返回类型是否为PageInfo,none返回Page
properties.setProperty("params", "count=countSql");//不是特别明白是啥意思
pageInterceptor.setProperties(properties)
//添加插件
bean.setPlugins(new Interceptor[] {pageInterceptor});
//添加XML目录
ResourcePatternResolver resolver = new PathMathchingResourcePatternResolver();
try {
bean.setMapperLocations(resolver.getResources("classpath:mapper/*.xml"));
SqlSessionFactory ssf = bean.getObject();
return ssf;
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
@Bean
public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
@Bean
@Override
public PlateformTransactionManager annotationDrivenTransactionManager() {
return new DataSourceTransactionManager(dataSource);
}
}
3、PageHelper踩坑
刚开始配置的时候,pageHelper超过最大页数后还会返回数据,看了一些文章发现了问题,问题代码如下:
properties.setProperty("reasonable", "true");
问题描述:在微服务里面做查询接口,用到pageHelper,数据库只有8行数据,pageNum=1&pageSize=10,pageNum=2&pageSize=10,pageNum=3&pageSize=10。。。返回的数据都是那8条。
原因:这是pageHelper里面自带的一个功能,叫做reasonable分页参数合理化,3.3.0以上版本可用,默认是false。 启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页; 禁用合理化时,如果pageNum<1或pageNum>pages会返回空数据。
解决方法:
properties.setProperty("reasonable", "false");
PageHelper配置到此结束。