前言

我们在讲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