开心一刻

  记得上初中,中午午休的时候,我和哥们躲在厕所里吸烟

  听见外面有人进来,哥们猛吸一口,就把烟甩了

  进来的是教导主任,问:你们干嘛呢?

  哥们鼻孔里一边冒着白烟一边说:我在生气

环境搭建

  依赖引入

   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 了,为什么还要查询记录?的更多相关文章

  1. 【mysql】 mybatis实现 主从表 left join 1:n 一对多 分页查询 主表从表都有查询条件 【mybatis】count 统计+JSON查询

    mybatis实现 主从表 left join  1:n 一对多 分页查询   主表从表都有查询条件+count 需求: ======================================= ...

  2. Mybatis包分页查询java公共类

    Mybatis包分页查询java公共类   分页----对于数据量非常大的查询中.是不可缺少的. mybatis底层的分页sql语句因为须要我们自己去手动写.而实现分页显示的时候我们须要依据分页查询条 ...

  3. 使用mybatis实现分页查询示例代码分析

    *******************************************分页查询开始*************************************************** ...

  4. mybatis 实现分页和过滤模糊查询

    基于 mybatis 的分页和过滤查询 学习内容: 分页设计 1.分页需传递的参数 2.分页需展示的数据 3.分页需展示的数据的来源 3.1.结果总数与结果集(分页原理) 3.2.总页数.上一页和下一 ...

  5. Mybatis 使用分页查询亿级数据 性能问题 DB使用ORACLE

    一般用到了mybatis框架分页就不用自己写了 直接用RowBounds对象就可以实现,但这个性能确实很低 今天我用到10w级得数据分页查询,到后面几页就迭代了很慢 用于记录 1.10万级数据如下 [ ...

  6. mybatis结合分页的使用及解析.

    首先说明: 这里分页是使用了SSM框架+ jsp 来做的, 当然分页还有其他的很多做法, 比如easyUI自带的分页效果. 但是这些原理都是很相似的, 再次只做为学习总结之用. 一, 效果图这里的截图 ...

  7. Mybatis的分页插件PageHelper

    Mybatis的分页插件PageHelper 项目地址:http://git.oschina.net/free/Mybatis_PageHelper  文档地址:http://git.oschina. ...

  8. Mybatis 的分页插件PageHelper-4.1.1的使用

    Mybatis 的分页插件 PageHelper 项目地址:http://git.oschina.net/free/Mybatis_PageHelper  文档地址:http://git.oschin ...

  9. 权限管理系统之项目框架搭建并集成日志、mybatis和分页

    前一篇博客中使用LayUI实现了列表页面和编辑页面的显示交互,但列表页面table渲染的数据是固定数据,本篇博客主要是将固定数据变成数据库数据. 一.项目框架 首先要解决的是项目框架问题,搭建什么样的 ...

随机推荐

  1. Dubbo telnet 命令能做什么?

    dubbo 服务发布之后,我们可以利用 telnet 命令进行调试.管理. Dubbo2.0.5 以上版本服务提供端口支持 telnet 命令 连接服务 telnet localhost 20880 ...

  2. Java 中应该使用什么数据类型来代表价格?

    如果不是特别关心内存和性能的话,使用 BigDecimal,否则使用预定义精度的 double 类型.

  3. C语言之常量(知识点4)

    一.常量(概念) ①用标识符代表常量 ②一般用大写字母表示 二.定义格式 #define 符号常量 常量 三.案例 #define PI 40; #define PRICE 30; 四.注意 ①其值在 ...

  4. ajax解析json对象集合

    这个需求是我们做项目经常遇到的,当你想渲染表格的数据,你的数据在servlet中存在了arraylist中,你想把arraylist传到ajax的data中,这时候就需要用到ObjectMapper对 ...

  5. (stm32f103学习总结)—stm32 PMW输出实验

    一.PWM简介 PWM是 Pulse Width Modulation 的缩写,中文意思就是脉冲宽度调 制,简称脉宽调制.它是利用微处理器的数字输出来对模拟电路进行控 制的一种非常有效的技术,其控制简 ...

  6. (3)_研究方法Methodology【论文写作】

  7. 使用jquery-webcam插件,实现人脸采集并转base64

    项目需求:在ie或chrome浏览器下,调用电脑摄像头(确保使用的是笔记本电脑,或者摄像头功能正常使用的台式机),进行人脸图像采集预览,并将图片的base64码传入到后台进行后续操作.该demo适用于 ...

  8. react开发教程(三)组件的构建

    什么是组件 组件化就好像我们的电脑装机一样,一个电脑由显示器.主板.内存.显卡.硬盘,键盘,鼠标.... 组件化开发有如下的好处:降低整个系统的耦合度,在保持接口不变的情况下,我们可以替换不同的组件快 ...

  9. 通过面试题学JavaScript知识(1)

    // a 是多少的时候 可以让下面的打印ok if(a == 1 && a == 2 && a ==3){ console.log('ok') } 分析1: == 比较 ...

  10. EFCore 6.0入门看这篇就够了

    前言 作为一直在dotNet行业耕耘的码农,这几年在大大小小项目中也涉及到了许多ORM框架,比如:EFCore,Dapper,NHibernate,SqlSugar等等,这些ORM都有各自的优缺点,大 ...