前言
我们在讲Mybatis的时候也没有提到分页,Mybatis的原生分页是将数据查询到内存,再在内存中进行的分页,不用多说,这在我们的实际应用中肯定是不被允许的。在Mybatis-plus出现之前,有一个Mybatis插件叫做PageHelper。PageHelper现在估计也有很多项目在使用,但其使用起来相对我们的Mybatis-plus的分页插件要麻烦一些。
MP的分页示例
基础的代码,请查看前文。
示例代码
@Test
public void t2(){
Page page = new Page(1,10);
Page rs = myEmpService.page(page);
System.out.println(rs.getTotal());
System.out.println(rs.getRecords().size());
}
Page对象,是我们MP已经定义好的对象,其total属性就是查询的结果总数,records就是当前页的list。
Page(1,10)表示当前查询第1页,每页查询10条数据。
注意事项
以上代码执行主要的日志如下:
c.y.b.mp.mapper.MyEmpMapper.selectPage : ==> Preparing: SELECT id,name,age,sex FROM t_my_emp
c.y.b.mp.mapper.MyEmpMapper.selectPage : ==> Parameters:
c.y.b.mp.mapper.MyEmpMapper.selectPage : <== Total: 10200
可以发现并没有分页。因为我们还需要做一个分页插件的配置
配置分页插件
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
注:此配置是使用最新版(3.5.1+)时的配置,旧版本的配置如下
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
// 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求 默认false
// paginationInterceptor.setOverflow(false);
// 设置最大单页限制数量,默认 500 条,-1 不受限制
// paginationInterceptor.setLimit(500);
// 开启 count 的 join 优化,只针对部分 left join
paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
return paginationInterceptor;
}
将分页插件添加进SqlSessionFactory
@Bean(name = "sessionFactory")
public SqlSessionFactory sqlSessionFactory(@Qualifier("hikariDataSource") DataSource ds) throws Exception {
log.info("数据源:{},aliasesPackage:{}",ds,this.aliasesPackage);
MybatisSqlSessionFactoryBean factoryBean = new MybatisSqlSessionFactoryBean();
factoryBean.setDataSource(ds);
if(this.aliasesPackage != null && !"".equals(this.aliasesPackage)) {
factoryBean.setTypeAliasesPackage(this.aliasesPackage);
}
//指定mapper xml目录
Assert.notEmpty(this.mapperLocations,"扫描的Mapper xml不能为空");
factoryBean.setMapperLocations(resolveMapperLocations(this.mapperLocations));
// 添加分页插件
factoryBean.setPlugins(mybatisPlusInterceptor());
return factoryBean.getObject();
}
如果我们自己定义了MybatisSqlSessionFactoryBean 那么需要在该配置中添加我们上面配置的分页插件,否则分页插件将不生效。
再次执行示例代码
打印结果如下:
c.y.b.m.m.M.selectPage_mpCount : ==> Preparing: SELECT COUNT(*) AS total FROM t_my_emp
c.y.b.m.m.M.selectPage_mpCount : ==> Parameters:
c.y.b.m.m.M.selectPage_mpCount : <== Total: 1
c.y.b.mp.mapper.MyEmpMapper.selectPage : ==> Preparing: SELECT id,name,age,sex FROM t_my_emp LIMIT ?
c.y.b.mp.mapper.MyEmpMapper.selectPage : ==> Parameters: 10(Long)
c.y.b.mp.mapper.MyEmpMapper.selectPage : <== Total: 10