關於 MyBatis-Plus 分頁查詢的探討 → count 都為 0 了,為什麼還要查詢記錄?

青石路發表於2022-05-09

開心一刻

  記得上初中,中午午休的時候,我和哥們躲在廁所裡吸菸

  聽見外面有人進來,哥們猛吸一口,就把煙甩了

  進來的是教導主任,問:你們幹嘛呢?

  哥們鼻孔裡一邊冒著白煙一邊說:我在生氣

關於 MyBatis-Plus 分頁查詢的探討 → count 都為 0 了,為什麼還要查詢記錄?

環境搭建

  依賴引入

   MyBatis-Plus 版本: 3.1.0 

   Spring Boot 版本: 2.1.0.RELEASE 

  因為是基於 Spring Boot ,所以 MyBatis-Plus 的依賴如下

  完整 pom.xml 如下

關於 MyBatis-Plus 分頁查詢的探討 → count 都為 0 了,為什麼還要查詢記錄?
<?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>
View Code

  配置引入

  配置很簡單,主要配置資料來源和 SQL 列印, application.yml 如下

關於 MyBatis-Plus 分頁查詢的探討 → count 都為 0 了,為什麼還要查詢記錄?
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
View Code

  表與初始資料

關於 MyBatis-Plus 分頁查詢的探討 → count 都為 0 了,為什麼還要查詢記錄?
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);
View Code

  環境驗證

   Service 、 Mapper 就不寫了,大家利用 mybatis-plus-generator (版本與 Mybatis-Plus 版本保持一致)生成下就好

  嫌麻煩的也可以直接下載我的程式碼:mybatis-plus-demo

  我們來跑個簡單案例看看 MyBatis Plus 是否搭建成功了

關於 MyBatis-Plus 分頁查詢的探討 → count 都為 0 了,為什麼還要查詢記錄?

  可以看到,環境搭建是成功的

問題復現

  分頁外掛

  既然是分頁上的問題,自然要引入分頁外掛

  用的就是 Mybatis Plus 的分頁外掛: PaginationInterceptor 

  分頁查詢也非常簡單, Mybatis Plus 提供了專門的 api ,如下

  使用如下

  查詢到資料的分頁

  我們先來看如下案例

  初始資料有 2 條,我們來看看此案例的 SQL 輸出

關於 MyBatis-Plus 分頁查詢的探討 → count 都為 0 了,為什麼還要查詢記錄?

  一共兩條 SQL 

  一條查詢總數

  一條查詢分頁記錄

  沒毛病,穩如老狗

  未查詢到資料的分頁

  前面的案例是能夠查到資料,如果查不到資料了?

  我們接著看另一個案例

  初始的 2 條資料中沒有 name = '吳用' 的記錄,那麼此時的 SQL 輸出是怎麼樣的了?

關於 MyBatis-Plus 分頁查詢的探討 → count 都為 0 了,為什麼還要查詢記錄?

  同樣輸出兩條 SQL 

  一條查詢總數

  一條查詢記錄

  這有沒有問題?大家想清楚再回答!

  肯定是有問題的,1、查詢記錄為什麼不帶分頁引數,2、總記錄數都是 0 了,為什麼還去查記錄

  2 個問題可以歸為一個問題:記錄數都為 0 了,為什麼還去查詢記錄?

關於 MyBatis-Plus 分頁查詢的探討 → count 都為 0 了,為什麼還要查詢記錄?

原始碼分析

  我們程式碼都沒寫,問題肯定不是出在我們身上

(這鍋甩的一點毛病沒有!)

  既然是分頁,那問題肯定出在分頁外掛上了!

   PaginationInterceptor 實現了 Mybatis 的 Interceptor 介面

  問題分析

  那麼分頁邏輯肯定在 PaginationInterceptor 的 intercept 方法內(關於原因,大家可以去看:spring-boot-2.0.3原始碼篇 - pageHelper分頁,絕對有值得你看的地方 以及與它相關的文章)

  我們來好好看看 intercept 方法

關於 MyBatis-Plus 分頁查詢的探討 → count 都為 0 了,為什麼還要查詢記錄?

  關鍵程式碼

  問題就出在

  既然 總記錄條數 都 <= 0 了,為什麼還要往下走(繼續查詢記錄),而不是直接返回 null 或者 空集合 ?

  至此,相信大家都明白問題所在了

  官方修復

   3.1.0 版本已經發布很久了

  這個問題不可能還未暴露,自此我特意去找了下 Mybatis Plus 的 commit 記錄,還真讓我找到了修復記錄

關於 MyBatis-Plus 分頁查詢的探討 → count 都為 0 了,為什麼還要查詢記錄?

  修復日期: 2019/4/14 ,而版本 3.1.1 的釋出日期: 2019/4/26 ,也就是說這個問題在 3.1.1 中已經修復了,我們來驗證下

關於 MyBatis-Plus 分頁查詢的探討 → count 都為 0 了,為什麼還要查詢記錄?  至此這個問題的來龍去脈,相信大家已經清楚了

總結

  1、大家選框架時,一定要注意版本

    最好能關注社群的問題討論

    開源框架的話,大家可以關注 Issues 

    我們遇到的坑可能已經被別人踩過了,能夠從中最快的找到解決方案

  2、隨著版本的迭代, Mybatis Plus 的分頁外掛實現有很大的改變,大家一定要結合應用的版本採用合適的分頁外掛

    感興趣的可以去看看各個釋出版本的改動,releases

相關文章