MyBatis分頁神器PageHelper深度解析

PageHelper 是一個優秀的 MyBatis 分頁插件,它通過簡單的攔截器機制,實現了對 MyBatis 查詢的物理分頁(而非內存分頁),極大簡化了分頁代碼的編寫。而 PageHelper 擴展 通常指的是在其核心功能基礎上,為特定框架(如 Spring Boot)或特定需求(如簡化配置、增強功能)提供的增強模塊或使用方式。

以下是對 PageHelper 及其常見擴展的介紹:


一、核心 PageHelper 功能回顧

  1. 核心原理
    • 基于 MyBatis 的 Interceptor 接口,攔截 Executor 的查詢方法。
    • 在執行目標 SQL 前,自動分析原 SQL 并生成 COUNT 查詢(獲取總數)和添加了物理分頁(如 LIMIT, ROWNUM)的查詢。
  2. 基本用法
    // 在查詢方法前調用,設置分頁參數
    PageHelper.startPage(pageNum, pageSize); // pageNum: 頁碼, pageSize: 每頁條數
    // 緊接著的第一個 MyBatis 查詢方法會被分頁
    List<Country> list = countryMapper.selectAll();
    // 用 PageInfo 包裝結果,包含分頁詳細信息(總記錄數、總頁數、當前頁等)
    PageInfo<Country> pageInfo = new PageInfo<>(list);
    
  3. 主要優點
    • 簡單:一行代碼啟動分頁。
    • 高效:物理分頁,數據庫壓力小。
    • 通用:支持多種數據庫(MySQL, Oracle, PostgreSQL, SQLServer 等)。
    • 靈活:支持多種參數傳遞方式(startPage 方法、RowBounds 參數)。
    • 豐富信息PageInfo 對象提供全面的分頁信息。

二、重要的 PageHelper 擴展

  1. pagehelper-spring-boot-starter

    • 定位:官方提供的 Spring Boot 自動配置 Starter。
    • 核心價值
      • 零配置/簡化配置:只需引入依賴,大部分情況下無需任何額外配置即可使用。
      • 自動注入:自動配置 PageHelper 攔截器并將其注冊到 MyBatis SqlSessionFactory 中。
      • 約定優于配置:遵循 Spring Boot 的配置習慣,可以通過 application.properties/application.yml 輕松配置插件屬性。
    • 依賴 (Maven):
      <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>最新版本</version> <!-- 請替換為當前最新版本,如 2.1.0 -->
      </dependency>
      
    • 常用配置示例 (application.yml):
      pagehelper:helper-dialect: mysql  # 指定數據庫方言(通常可自動檢測)reasonable: true       # 啟用合理化:pageNum<=0 時設為 1,pageNum>總頁數時設為最后一頁support-methods-arguments: true # 支持通過 Mapper 接口參數傳遞分頁參數params: count=countSql  # 配置 COUNT 查詢的返回值 keypage-size-zero: true    # 允許 pageSize=0 時查詢所有結果(返回 PageInfo,total=實際條數)
      
    • 使用:在 Spring Boot 項目中引入該 starter 后,直接在 Service 或 Controller 中使用 PageHelper.startPage(pageNum, pageSize) 即可。
  2. PageHelper 的參數模式擴展

    • 核心功能擴展:除了 PageHelper.startPagePageHelper 本身支持更靈活的參數傳遞:
      • 方法參數傳遞 (需配置 support-methods-arguments: true):
        // Mapper 接口
        List<User> selectUsers(@Param("name") String name, @Param("pageNum") int pageNum, @Param("pageSize") int pageSize);
        
        // Service 調用 (無需顯式調用 startPage)
        List<User> users = userMapper.selectUsers("John", 2, 10);
        PageInfo<User> pageInfo = new PageInfo<>(users);
        
      • RowBounds 參數傳遞 (較舊方式,優先級低于 startPage):
        List<User> users = sqlSession.selectList("selectUsers", null, new RowBounds(2, 10));
        
  3. PageInfo 的增強

    • 雖然 PageInfo 本身是核心的一部分,但它提供的豐富分頁信息是其強大擴展性的體現:
      • getTotal():總記錄數。
      • getPages():總頁數。
      • getPageNum():當前頁碼。
      • getPageSize():每頁條數。
      • getList():當前頁的數據列表。
      • isIsFirstPage()/isIsLastPage():是否第一頁/最后一頁。
      • hasPreviousPage()/hasNextPage():是否有上一頁/下一頁。
      • getPrePage()/getNextPage():上一頁/下一頁頁碼。
      • getNavigatepageNums():所有導航頁碼(如 [1,2,3,4,5])。
    • 這極大地簡化了將分頁信息返回給前端的工作。

三、使用 PageHelper 擴展的注意事項

  1. PageHelper.startPage 的調用位置
    • 必須緊挨著需要分頁的 MyBatis 查詢方法調用之前。中間不能有其它可能觸發查詢的操作(如調用另一個查詢方法)。
  2. 線程安全
    • PageHelper.startPage 內部使用 ThreadLocal 保存分頁參數。這意味著它是線程安全的,但也意味著分頁參數只對當前線程的緊接著的下一次查詢有效。查詢完成后,ThreadLocal 會被自動清理。在異步、多線程或復雜調用鏈中要特別注意調用時機。
  3. PageInfo 的構造
    • 傳入 PageInfo 構造器的 List 對象,必須是 PageHelper.startPage 后執行分頁查詢返回的那個 List。這個 List 實際上是一個 Page 對象(實現了 List 接口),包含了分頁信息。如果用其他 List 構造 PageInfo,信息會錯誤。
  4. 數據庫方言 (dialect)
    • 確保配置正確的數據庫方言,或讓插件自動檢測(通常可行)。錯誤的方言會導致生成錯誤的分頁 SQL。
  5. reasonable 參數
    • 建議開啟 (reasonable: true),避免用戶傳入非法頁碼導致空數據或錯誤。
  6. page-size-zero
    • 如果業務有“pageSize=0 時返回所有數據”的需求,配置 page-size-zero: true。注意此時 PageInfototal 是實際數據條數(可能很大),pages 為 1。
  7. 避免與 RowBounds 混用
    • 如果同時使用了 PageHelper.startPageRowBounds 參數,PageHelper.startPage 的優先級更高。

四、總結

  • 核心 PageHelper:提供了 MyBatis 物理分頁的核心攔截能力和基礎 API (startPage, PageInfo)。
  • 關鍵擴展 pagehelper-spring-boot-starter:極大簡化了在 Spring Boot 項目中的集成和使用,是當前最推薦的使用方式,實現了開箱即用。
  • 參數模式擴展:提供 startPage 之外更靈活的傳參方式(方法參數、RowBounds),適應不同編碼風格。
  • PageInfo 對象:作為核心功能的一部分,提供了強大的分頁信息封裝能力,是返回給前端的理想數據結構。

選擇建議:對于 Spring Boot 項目,直接使用 pagehelper-spring-boot-starter 是最佳實踐。充分利用其自動配置和屬性配置,結合 PageHelper.startPagePageInfo,可以非常高效、簡潔地實現功能強大且信息完整的分頁功能。理解核心原理和注意事項(尤其是 startPage 的調用位置和線程特性)是避免踩坑的關鍵。

如果你有特定的 PageHelper 擴展需求(比如集成到其他框架,或者自定義分頁邏輯),可以進一步探討其 SPI 機制或自定義攔截器實現。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/91805.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/91805.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/91805.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【2025/07/19】GitHub 今日熱門項目

GitHub 今日熱門項目 &#x1f680; 每日精選優質開源項目 | 發現優質開源項目&#xff0c;跟上技術發展趨勢 &#x1f4cb; 報告概覽 &#x1f4ca; 統計項&#x1f4c8; 數值&#x1f4dd; 說明&#x1f4c5; 報告日期2025-07-19 (周六)GitHub Trending 每日快照&#x1f55…

【數據結構】二叉樹初階詳解(一):樹與二叉樹基礎 + 堆結構全解析

文章目錄&#x1f4dd;前言&#x1f320;樹的概念和結構&#x1f309;樹的概念&#x1f309;樹的相關概念&#x1f309;樹的表示&#x1f320;二叉樹概念及結構&#x1f309;二叉樹的概念&#x1f309;特殊的二叉樹&#x1f309;二叉樹的性質&#x1f320;二叉樹順序結構及實現…

Flutter基礎(前端教程①⑤-API請求轉化為模型列成列表展示實戰)

models/post_model.dart定義 Post 數據模型包含 fromJson() 方法用于解析 JSONcontrollers/post_controller.dart管理帖子數據的獲取和狀態使用 http 包請求 API通過 RxList 和 RxBool 實現響應式狀態管理views/post_list_view.dart展示帖子列表的 UI使用 Obx 監聽狀態變化包含…

第十五屆全國大學生數學競賽初賽試題(非數學專業類A卷)

第十五屆全國大學生數學競賽初賽試題(非數學專業類A卷) 文章目錄第十五屆全國大學生數學競賽初賽試題(非數學專業類A卷)題目速覽逐題詳解題目速覽 求極限&#xff1a; lim?x→3x39?62?x3?23.\lim\limits_{x \to 3} \frac{\sqrt{x^3 9} - 6}{2 - \sqrt{x^3 - 23}} \rule{2…

ROS1/Linux——Ubuntu、ROS1虛擬機環境配置

ROS1/Linux——Ubuntu、ROS1虛擬機環境配置 文章目錄ROS1/Linux——Ubuntu、ROS1虛擬機環境配置編輯時間&#xff1a;系統環境Linux鏡像下載Ubuntu相關鏈接iso鏡像下載VMware操作虛擬機安裝步驟基礎設置設置語言設置窗口分辨率、圖標大小等終端固定在左側欄顯示隱藏文件夾其他問…

萬字解析LVS集群

一、集群和分布式介紹1.1、誕生的原因單臺設備 “又貴又弱又容易掛”&#xff0c;扛不住現代業務的 “海量訪問、海量數據、復雜計算”&#xff1b;集群 / 分布式讓多臺設備 “抱團干活”&#xff0c;分擔壓力&#xff08;流量、存儲、計算&#xff09;&#xff0c;還能 “壞了…

關于博客后續內容會以xmind內容轉markdown格式來呈現

自己感覺不正確的地方 一直感覺學啥東西記到博客里&#xff0c;這樣就方便后續回顧或者查找 但csdn貌似不適合全局搜索&#xff0c;也就是我居然先要知道我對應的模糊點對應到哪篇文章&#xff0c;然后再到那篇文章里找&#xff0c;簡直麻煩死了&#xff0c;而且另外一個毛病是…

Python - 數據分析三劍客之Pandas

閱讀前可參考NumPy文章 https://blog.csdn.net/MinggeQingchun/article/details/148253682https://blog.csdn.net/MinggeQingchun/article/details/148253682 ?Pandas是Python中一個強大的開源數據分析庫&#xff0c;專門用于處理結構化數據&#xff08;如表格、時間序列等&…

深度解析:Python實戰京東資產拍賣平臺爬蟲,從ID抓取到詳情數據落地

深度解析:Python實戰京東資產拍賣平臺爬蟲,從ID抓取到詳情數據落地 對爬蟲、逆向感興趣的同學可以查看文章,一對一小班教學(系統理論和實戰教程)、提供接單兼職渠道:https://blog.csdn.net/weixin_35770067/article/details/142514698 文章目錄 深度解析:Python實戰京東…

ServletConfig 接口詳解

ServletConfig 接口詳解 1. 核心概念 ServletConfig 是 Servlet 規范中定義的核心接口&#xff0c;用于在 Servlet 初始化階段向 Servlet 傳遞配置信息。每個 Servlet 都有自己獨立的 ServletConfig 對象。 2. 關鍵特性特性說明唯一性每個 Servlet 實例擁有獨立的 ServletConfi…

Maven學習總結(62)—— Maven 打包瘦身和提速解決方案

臃腫的 Maven 項目 在 Java 項目開發中,Maven 作為強大的項目管理和構建工具,極大地簡化了依賴管理和項目構建過程。但隨著項目的不斷演進,依賴的 Jar 包越來越多,我們的 Maven 項目也逐漸變得臃腫不堪。曾經,我參與維護一個大型的 Spring Boot 項目,隨著業務功能的不斷…

【Qt開發】Qt的背景介紹(三)-> 認識Qt Creator

目錄 1 -> Qt Creator概覽 2 -> 使用Qt Creator創建項目 2.1 -> 新建項目 2.2 -> 選擇項目模板 2.3 -> 選擇項目路徑 2.4 -> 選擇構建系統 2.5 -> 填寫類信息設置界面 2.6 -> 選擇語言和翻譯文件 2.7 -> 選擇Qt套件 2.8 -> 選擇版本控…

HTML5中的自定義屬性

自定義屬性&#xff08;Custom Attributes&#xff09; 允許在標準 HTML 屬性之外&#xff0c;為元素添加額外的元數據&#xff08;metadata&#xff09;。 1. 標準方式&#xff1a;data-* 屬性 HTML5 引入了 data-* 前綴的自定義屬性規范&#xff0c;所有以 data- 開頭的屬性都…

前端項目利用Gitlab CI/CD流水線自動化打包、部署云服務

疊甲前言 本文僅作為個人學習GitLab的CI/CD功能記錄&#xff0c;不適合作為專業性指導&#xff0c;如有紕漏&#xff0c;煩請君指正。 Gitlab的CI/CD做什么用的 自工作以來&#xff0c;去過大大小小公司&#xff0c;有一些公司技術人員專業性欠佳&#xff0c;每當產品經理或…

基于typescript嚴格模式以實現undo和redo功能為目標的命令模式代碼參考

下面是一個完整的、嚴格模式下的 TypeScript 實現&#xff0c;包含 CommandManager、Command 和 CompositeCommand 類&#xff0c;支持 undo/redo 功能。完整實現代碼1. Command 接口和基類// src/commands/ICommand.ts export interface ICommand {execute(): void;undo(): vo…

2022年CIE SCI2區TOP,NSGA-II+直升機-無人機搜救任務分配,深度解析+性能實測

目錄1.摘要2.數學模型3.求解方法4.結果展示5.參考文獻6.代碼獲取7.算法輔導應用定制讀者交流1.摘要 無人機任務分配對于保障搜救活動高效有序開展具有重要意義&#xff0c;但現有研究較少考慮無人機作業環境與性能對任務分配的影響。針對低空風場和地形因素對無人機能耗與性能…

暑期算法訓練.4

目錄 15.力扣 904.水果成籃 15.1 題目解析&#xff1a; 15.2 算法思路&#xff1a; 15.2.1 暴力解法&#xff1a; 15.2.1 滑動窗口 15.3代碼演示&#xff1a; 15.4 總結反思&#xff1a; 16 力扣 438.找出字符串中所有字母的異位詞 16.1 題目解析&#xff1a; 16.2算法…

關于個人博客系統的測試報告

1&#xff09;項目背景2&#xff09;項目功能介紹 登陸寫博客/編輯已存在博客刪除博客注銷 2&#xff09;基于項目功能設計相關測試用例3&#xff09;基于測試用例編寫自動化測試 準備工作登陸界面相關博客首頁相關博客詳情頁相關編輯博客相關刪除博客相關注銷相關 4&#xff0…

Spring Boot 與微服務詳細總結

一、Spring Boot 核心概述 Spring Boot 是簡化 Spring 應用開發的框架&#xff0c;作為 Spring 技術棧的整合方案和 J2EE 開發的一站式解決方案&#xff0c;其核心優勢體現在&#xff1a; 快速創建獨立運行的 Spring 項目&#xff0c;輕松集成主流框架內置 Servlet 容器&…

輕松上手:從零開始啟動第一個 Solana 測試節點

嗨&#xff0c;各位技術愛好者們&#xff01; 大家是否對 Solana 的“光速”交易處理能力感到好奇&#xff1f;或者你是一名開發者&#xff0c;正準備在 Solana 上構建下一個殺手級 dApp&#xff1f;無論大家是出于學習目的還是實際開發需求&#xff0c;親手運行一個 Solana 節…