关于 MyBatis-Plus 分页查询的探讨 → count 都为 0 了,为什么还要查询记录?
开心一刻
记得上初中,中午午休的时候,我和哥们躲在厕所里吸烟
听见外面有人进来,哥们猛吸一口,就把烟甩了
进来的是教导主任,问:你们干嘛呢?
哥们鼻孔里一边冒着白烟一边说:我在生气

环境搭建
依赖引入
MyBatis-Plus 版本: 3.1.0
Spring Boot 版本: 2.1.0.RELEASE
因为是基于 Spring Boot ,所以 MyBatis-Plus 的依赖如下

完整 pom.xml 如下

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>com.qsl</groupId>
<artifactId>mybatis-plus-demo</artifactId>
<version>1.0-SNAPSHOT</version> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.0.RELEASE</version>
</parent> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.1.0</version>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
</project>
配置引入
配置很简单,主要配置数据源和 SQL 打印, application.yml 如下

spring:
application:
name: mybatis-plus-demo
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/my_project?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai
username: root
password: 123456
# SQL 打印,便于发现问题
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
表与初始数据

DROP TABLE IF EXISTS `tbl_user`;
CREATE TABLE `tbl_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL COMMENT '姓名',
`age` tinyint(3) NOT NULL COMMENT '年龄',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB;
INSERT INTO `tbl_user` VALUES (1, '张三', 20);
INSERT INTO `tbl_user` VALUES (2, '李四', 21);
环境验证
Service 、 Mapper 就不写了,大家利用 mybatis-plus-generator (版本与 Mybatis-Plus 版本保持一致)生成下就好
嫌麻烦的也可以直接下载我的代码:mybatis-plus-demo
我们来跑个简单案例看看 MyBatis Plus 是否搭建成功了

可以看到,环境搭建是成功的
问题复现
分页插件
既然是分页上的问题,自然要引入分页插件
用的就是 Mybatis Plus 的分页插件: PaginationInterceptor

分页查询也非常简单, Mybatis Plus 提供了专门的 api ,如下

使用如下

查询到数据的分页
我们先来看如下案例

初始数据有 2 条,我们来看看此案例的 SQL 输出

一共两条 SQL
一条查询总数

一条查询分页记录

没毛病,稳如老狗

未查询到数据的分页
前面的案例是能够查到数据,如果查不到数据了?
我们接着看另一个案例

初始的 2 条数据中没有 name = '吴用' 的记录,那么此时的 SQL 输出是怎么样的了?

同样输出两条 SQL
一条查询总数

一条查询记录

这有没有问题?大家想清楚再回答!
肯定是有问题的,1、查询记录为什么不带分页参数,2、总记录数都是 0 了,为什么还去查记录
2 个问题可以归为一个问题:总记录数都为 0 了,为什么还去查询记录?

源码分析
我们代码都没写,问题肯定不是出在我们身上

(这锅甩的一点毛病没有!)
既然是分页,那问题肯定出在分页插件上了!
PaginationInterceptor 实现了 Mybatis 的 Interceptor 接口
问题分析
那么分页逻辑肯定在 PaginationInterceptor 的 intercept 方法内(关于原因,大家可以去看:spring-boot-2.0.3源码篇 - pageHelper分页,绝对有值得你看的地方 以及与它相关的文章)
我们来好好看看 intercept 方法

关键代码

问题就出在

既然 总记录条数 都 <= 0 了,为什么还要往下走(继续查询记录),而不是直接返回 null 或者 空集合 ?
至此,相信大家都明白问题所在了
官方修复
3.1.0 版本已经发布很久了

这个问题不可能还未暴露,自此我特意去找了下 Mybatis Plus 的 commit 记录,还真让我找到了修复记录

修复日期: 2019/4/14 ,而版本 3.1.1 的发布日期: 2019/4/26 ,也就是说这个问题在 3.1.1 中已经修复了,我们来验证下
至此这个问题的来龙去脉,相信大家已经清楚了
总结
1、大家选框架时,一定要注意版本
最好能关注社区的问题讨论
开源框架的话,大家可以关注 Issues
我们遇到的坑可能已经被别人踩过了,能够从中最快的找到解决方案
2、随着版本的迭代, Mybatis Plus 的分页插件实现有很大的改变,大家一定要结合应用的版本采用合适的分页插件
感兴趣的可以去看看各个发布版本的改动,releases
关于 MyBatis-Plus 分页查询的探讨 → count 都为 0 了,为什么还要查询记录?的更多相关文章
- 【mysql】 mybatis实现 主从表 left join 1:n 一对多 分页查询 主表从表都有查询条件 【mybatis】count 统计+JSON查询
mybatis实现 主从表 left join 1:n 一对多 分页查询 主表从表都有查询条件+count 需求: ======================================= ...
- Mybatis包分页查询java公共类
Mybatis包分页查询java公共类 分页----对于数据量非常大的查询中.是不可缺少的. mybatis底层的分页sql语句因为须要我们自己去手动写.而实现分页显示的时候我们须要依据分页查询条 ...
- 使用mybatis实现分页查询示例代码分析
*******************************************分页查询开始*************************************************** ...
- mybatis 实现分页和过滤模糊查询
基于 mybatis 的分页和过滤查询 学习内容: 分页设计 1.分页需传递的参数 2.分页需展示的数据 3.分页需展示的数据的来源 3.1.结果总数与结果集(分页原理) 3.2.总页数.上一页和下一 ...
- Mybatis 使用分页查询亿级数据 性能问题 DB使用ORACLE
一般用到了mybatis框架分页就不用自己写了 直接用RowBounds对象就可以实现,但这个性能确实很低 今天我用到10w级得数据分页查询,到后面几页就迭代了很慢 用于记录 1.10万级数据如下 [ ...
- mybatis结合分页的使用及解析.
首先说明: 这里分页是使用了SSM框架+ jsp 来做的, 当然分页还有其他的很多做法, 比如easyUI自带的分页效果. 但是这些原理都是很相似的, 再次只做为学习总结之用. 一, 效果图这里的截图 ...
- Mybatis的分页插件PageHelper
Mybatis的分页插件PageHelper 项目地址:http://git.oschina.net/free/Mybatis_PageHelper 文档地址:http://git.oschina. ...
- Mybatis 的分页插件PageHelper-4.1.1的使用
Mybatis 的分页插件 PageHelper 项目地址:http://git.oschina.net/free/Mybatis_PageHelper 文档地址:http://git.oschin ...
- 权限管理系统之项目框架搭建并集成日志、mybatis和分页
前一篇博客中使用LayUI实现了列表页面和编辑页面的显示交互,但列表页面table渲染的数据是固定数据,本篇博客主要是将固定数据变成数据库数据. 一.项目框架 首先要解决的是项目框架问题,搭建什么样的 ...
随机推荐
- C++11最常用的新特性如下
1.auto关键字:编译器可以根据初始值自动推导出类型.但是不能用于函数传参.定义数组以及非静态成员变量. 2.nullptr关键字:是一种特殊类型的字面值,它可以被转换成任意其它类型的指针:而NUL ...
- Executors 类是什么?
Executors 为 Executor,ExecutorService,ScheduledExecutorService, ThreadFactory 和 Callable 类提供了一些工具方法. ...
- js技术之input只读功能可以通过js设置readonly
一.input标签 输入项标签,不同type属性,会有不同的显示效果和不同的作用 input标签的属性: disabled:表单项禁用,不可修改值,也不会被提交 readonly:表单项只读,不可修改 ...
- 6. Git管理远程仓库
6. Git管理远程仓库 使用远程仓库的目的 作用:备份,实现代码共享集中化管理 Git克隆操作 目的 将远程仓库(github对应的项目)复制到本地 代码 git clone 仓库地址 多学一招:仓 ...
- expression:_CrtlsValidHeapPointer
详见stackoverflow "_CrtIsValidHeapPointerUserData means, that you have a heap corruption, which i ...
- 【转自百度fex】fex-team/interview-questions
fex-team/interview-questions 注意 目前发现有其他人以 FEX 团队名义进行招聘,发出的邮箱皆为私人邮箱. 为防止在投递简历出现误会,在此提醒各位注意: FEX 团队没有以 ...
- 微信小程序&mpvue问题总结(1)
微信小程序进入到首页的时候,日志打印出"created", "onlaunch", "mounted",具体代码如下:那么,在小程序中 cr ...
- Supervisor学习笔记
请点击我 > supervisor笔记
- SpringBoot2.x修改Redis序列化方式
添加一个配置类即可: /** * @Author FengZeng * @Date 2022-03-22 13:43 * @Description TODO */ @Configuration pub ...
- LC-209
给定一个含有 n 个正整数的数组和一个正整数 target . 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, nums ...