mybatis-plus分页查询出现count()问题详细解决过程

项目场景:

在使用mybatis-plus分页和pagehelper分页时遇到的问题
mybatis-plus-boot-starter版本为3.4.1
pagehelper版本为5.3.2


问题描述

在使用IPage分页时突然就出现了如下报错,因为之前在使用的时候一直都是没问题的怎么就突然报错了,真的是让人百思不得其解,也没想太多直接上了百度,发现有的说mybatis-plus-boot-starter版本问题升下版本就ok了,也有的说... 众说纷纭, 于是就有了以下的排查过程。

sql报错内容
在这里插入图片描述

原因分析:

随着好奇的心,一路debug开心的走进了源码

  1. 进入到MybatisPlusInterceptor拦截类
  2. 找到分页前执行的count的代码逻辑
  3. 具体的问题具体分析

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
以上是debug的大概过程,看到这里大家应该知道了其实在底层逻辑中就已经有问题了,不知道大家还记得我上面说之前用一直是好好的,为什么突然就不行了。
原因是我在整理maven时,把mybatis-plus-boot-starter中jsqlparser排除了,并且加上了mybatis-plus的代码生成mybatis-plus-generator,导致jsqlparser版本不一致的问题。

在这里插入图片描述
jsqlparser4.5版本根据上面dubug过程是有问题的,jsqlparser3.2版本会有什么不一样吗,好奇的心,激动的手,一路小走进源码,其他的过程不看只看核心部分。
在这里插入图片描述
在这里插入图片描述

解决方案:

  1. 第一种方式:可以把pagehelper中的jsqlparse包r排除掉,使用mybatis-plus-boot-starter中的jsqlparser包
			<dependency>
                <groupId>com.github.pagehelper</groupId>
                <artifactId>pagehelper</artifactId>
                <version>${pagehelper.version}</version>
                <exclusions>
                    <exclusion>
                        <groupId>com.github.jsqlparser</groupId>
                        <artifactId>jsqlparser</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
  1. 第二种方式:可以把pagehelper和mybatis-plus-boot-starter中的jsqlparser包全部排除掉,如果有用到mybatis-plus-generator代码生成也需要将其中的jsqlparser排除掉,再重新加上jsqlparser的maven坐标,重新引入jsqlparser版本使用需要和mybatis-plus-boot-starter中引用的一致
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>${mybatis-plus-boot-starter.version}</version>
                <exclusions>
                    <exclusion>
                        <groupId>com.github.jsqlparser</groupId>
                        <artifactId>jsqlparser</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>

            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-generator</artifactId>
                <version>${mybatis-plus-generator.version}</version>
                <exclusions>
                    <exclusion>
                        <groupId>com.github.jsqlparser</groupId>
                        <artifactId>jsqlparser</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>

			<dependency>
                <groupId>com.github.pagehelper</groupId>
                <artifactId>pagehelper</artifactId>
                <version>${pagehelper.version}</version>
                <exclusions>
                    <exclusion>
                        <groupId>com.github.jsqlparser</groupId>
                        <artifactId>jsqlparser</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            
  1. 第三种方式:至于升mybatis-plus版本的话如果是商业项目其实是存在风险问题,个人项目的话就随意
  2. 不建议mybatis-plus分页和pagehelper分页一起混用,无奈之举的话可以考虑第一种和第二种方式

到这里就结束啦,祝大家生活愉快!

  • 21
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
Mybatis-Plus提供了一个Page对象用于分页查询,其中包括当前页码、每页显示数量、总记录数等信息。在进行分页查询时,我们需要先查询总记录数,然后再查询对应的数据页。 Mybatis-Plus已经为我们提供了方便的方法来进行分页查询,我们只需要在mapper接口中定义一个带有Page参数的查询方法即可。例如: ```java List<User> selectUserList(Page<User> page); ``` 在查询中,我们需要使用Mybatis-Plus提供的Page对象来进行分页查询。在查询之前,我们需要先设置Page对象的当前页码和每页显示数量: ```java Page<User> page = new Page<>(1, 10); // 查询第1页,每页显示10条记录 ``` 接下来,我们需要在查询之前先查询出总记录数,这个过程可以使用Mybatis-Plus提供的selectCount方法: ```java long total = userMapper.selectCount(null); // 查询总记录数 page.setTotal(total); // 设置总记录数 ``` 然后,我们就可以使用Page对象进行分页查询了: ```java List<User> userList = userMapper.selectUserList(page); page.setRecords(userList); // 设置数据页 ``` 在进行分页查询时,Mybatis-Plus会自动拼接分页SQL语句,并将分页参数传递给SQL语句。例如,在MySQL中,分页SQL语句可以如下所示: ```sql SELECT * FROM user LIMIT 0, 10; ``` 其中,0表示起始记录数,10表示每页显示数量。Mybatis-Plus会根据当前页码和每页显示数量自动计算出起始记录数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值