mybatis-plus 分页插件

Posted IT盛夏的果实

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis-plus 分页插件相关的知识,希望对你有一定的参考价值。

目录

1 前言 

 2 配置分页插件

2.1 selectPage()测试

2.2 自定义分页功能


1 前言 

        大家之前肯定都用过PageHelper来进行分页,其实mybatisplus中也提供了一个分页插件PaginationInnerInterceptor,其实分页的本质就是内部封装了一个拦截器,对于满足条件的数据进行过滤处理。

 2 配置分页插件

相关配置:

@Configuration
//扫描mapper接口所在的包
@MapperScan("com.atguigu.mybatisplus.mapper")
public class MyBatisPlusConfig 

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor()
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        //添加分页插件
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.mysql));
        return interceptor;
    

注意:因为PaginationInnerInterceptor支持好几种数据库类型,DbType根据类型获取应使用的分页方案。

2.1 selectPage()测试

在mapper提供的API中就有进行分页的方法selectPage,一个是Page对象,一个是Wrapper条件构造器对象。(就是将用wrapper对象筛选出符合条件的数据,然后根据page对象进行分页)

<P extends IPage<T>> P selectPage(P page, @Param("ew") Wrapper<T> queryWrapper);

测试语句:

    @Test
    public void testPage()
        Page<User> page = new Page<>(2, 3);
        userMapper.selectPage(page, null);
        System.out.println("当前页数据:"+page.getRecords());
        System.out.println("总分页数量:"+page.getPages());
        System.out.println("总记录数量:"+page.getTotal());
        System.out.println("是否有下一页:"+page.hasNext());
        System.out.println("是否有上一页:"+page.hasPrevious());
    

控制台打印输出:

 可以发现,我们的Page对象中的输入了两个参数,一个当前页,一个每页条数。

2.2 自定义分页功能

有时候可能mybatisplus中mapper提供的API不足以满足我们从查询要求,那么此时就需要我们自定义一个分页

mapper:

    /**
     * 通过年龄查询用户信息并分页
     * @param page MyBatis-Plus所提供的分页对象,必须位于第一个参数的位置
     * @param age
     * @return
     */
    Page<User> selectPageVo(@Param("page") Page<User> page, @Param("age") Integer age);

注意:mybatis-plus提供的分页对象,必须位于第一个参数的位置。

mapper.xml:

    <!--Page<User> selectPageVo(@Param("page") Page<User> page, @Param("age") Integer age);-->
    <select id="selectPageVo" resultType="User">
        select uid,user_name,age,email from t_user where age > #age
    </select>

测试类:

    @Test
    public void testPageVo()
        Page<User> page = new Page<>(1, 3);
        userMapper.selectPageVo(page, 20);
        System.out.println(page.getRecords());
        System.out.println(page.getPages());
        System.out.println(page.getTotal());
        System.out.println(page.hasNext());
        System.out.println(page.hasPrevious());
    

控制台sql:

==>  Preparing: SELECT COUNT(*) AS total FROM t_user WHERE age > ?
==> Parameters: 20(Integer)
<==    Columns: total
<==        Row: 90
<==      Total: 1
==>  Preparing: select uid,user_name,age,email from t_user where age > ? LIMIT ?
==> Parameters: 20(Integer), 3(Long)
<==    Columns: uid, user_name, age, email
<==        Row: 1, ybc1, 21, null
<==        Row: 2, ybc2, 22, null
<==        Row: 3, ybc3, 23, null
<==      Total: 3
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@3a08078c]
[User(id=null, name=null, age=21, email=null, isDeleted=null), User(id=null, name=null, age=22, email=null, isDeleted=null), User(id=null, name=null, age=23, email=null, isDeleted=null)]
30
90
true
false

可以发现,我们在xml文件中写的sql并没有实现分页功能,而是在mapper文件中传输过来时已经帮我们实现好了。

Mybatis-Plus分页插件

MybatisPlusConfig类

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 此类copy自官方文档中介绍的SpringBoot方式 https://mp.baomidou.com/guide/page.html
 */
@Configuration
public class MybatisPlusConfig 

    // 旧版
    @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;
    

    // 最新版
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() 
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    


MybatisSqlSessionFactoryBean设置插件

// 设置 MyBatis-Plus 分页插件
MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
Interceptor[] plugins = new MybatisPlusConfig().mybatisPlusInterceptor();
bean.setPlugins(plugins);

报错排查

若在xml传入page使用分页查询时正常,而在使用baseMapper.selectPage(page, wrapper)查询时报错:

net.sf.jsqlparser.statement.select.PlainSelect.getGroupBy()Lnet/sf/jsqlparse

原因:在使用mybatis分页插件时,需要依赖jsqlparser。这个错误表示分页插件版本与依赖版本不匹配。

解决:本次主要是jsqlparser版本较低(1.0),改为3.1版本之后可正常使用

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.1.4</version>
</dependency>
<dependency>
    <groupId>com.github.jsqlparser</groupId>
    <artifactId>jsqlparser</artifactId>
    <version>3.1</version>
</dependency>

参考

MybatisPlus官方指南

SpringBoot集成mybatis分页插件问题

为啥MyBatis-Plus 分页插件不生效?

MyBatis-Plus 分页插件失效分析

使用mybatis分页插件报错

以上是关于mybatis-plus 分页插件的主要内容,如果未能解决你的问题,请参考以下文章

四步教你SpringBoot+Mybatis-plus分页插件(简单实现)

mybatis-plus 分页插件

Mybatis-Plus分页插件

Mybatis-Plus分页插件

Mybatis-Plus分页插件

Mybatis-Plus分页插件查询慢解决方案