MyBatis分頁:PageHelper

MyBatis分頁:PageHelper

📖 前言:為什么需要分頁?

在處理大量數據時,一次性從數據庫查詢并返回所有結果是不可行的,這會帶來巨大的性能和內存開銷。分頁是解決這一問題的標準方案。而PageHelper是一個極其流行的MyBatis物理分頁插件,它能以“非侵入式”的方式,讓我們無需在SQL中編寫LIMIT子句,即可輕松實現分頁。

🎯 什么是PageHelper?

PageHelper是一個MyBatis插件,它通過AOP攔截即將執行的SQL查詢。當你發起一個分頁請求時,它會自動為你追加對應數據庫方言的分頁語句(如MySQL的LIMIT),從而實現物理分頁。其最大的優點是你只需編寫最純粹的業務查詢SQL,將分頁邏輯與業務邏輯完全解耦。

🔧 Spring Boot集成

1. 添加依賴

pom.xml中引入官方的starter依賴:

<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>2.1.0</version> </dependency>
2. 關于配置 (application.yml )

在很多情況下,由于starter強大的自動檢測能力(例如,它可以根據JDBC URL自動識別數據庫類型),PageHelper可以零配置工作,但強烈建議進行顯式配置

為什么推薦配置?

  • 穩定性:明確指定helper-dialect可以避免因JDBC URL不規范導致的方言識別失敗。
  • 功能開啟:可以方便地開啟reasonable(分頁參數合理化)等高級功能。
  • 清晰性:配置即文檔,讓項目配置一目了然。

推薦配置 (application.yml)

pagehelper:helper-dialect: mysql         # 明確指定數據庫方言reasonable: true              # 開啟分頁參數合理化

🚀 核心用法:兩種主流風格 (Page vs PageInfo)

PageHelper的核心魅力在于其簡潔的調用方式。主要有兩種風格,一種是使用PageInfo全家桶,另一種是像您展示的那樣,使用Page對象手動封裝。

1:使用 PageInfo (便捷的一站式方案)

這是官方最推薦的用法,它將所有分頁信息封裝在一個PageInfo對象中,非常方便。

流程:

  1. PageHelper.startPage(pageNum, pageSize);
  2. List<T> list = yourMapper.select(...);
  3. PageInfo<T> pageInfo = new PageInfo<>(list);
  4. pageInfo對象返回給前端。
@Service
public class UserServiceImpl implements UserService {@Autowiredprivate UserMapper userMapper;@Overridepublic PageInfo<User> findUsersByPage(int pageNum, int pageSize) {// 1. 開啟分頁PageHelper.startPage(pageNum, pageSize);// 2. 執行查詢 (這是一個普通的、不帶分頁的查詢)List<User> userList = userMapper.findAll();// 3. 將查詢結果封裝到PageInfo對象中PageInfo<User> pageInfo = new PageInfo<>(userList);return pageInfo;}
}
核心屬性與方法

PageInfo是PageHelper返回的核心對象,它包含了豐富的分頁信息,可以直接序列化為JSON返回給前端。

屬性類型說明
pageNumint當前頁碼
pageSizeint每頁數量
sizeint當前頁的數量
totallong總記錄數
pagesint總頁數
listList<T>當前頁的數據列表
prePageint上一頁頁碼
nextPageint下一頁頁碼
isFirstPageboolean是否為第一頁
isLastPageboolean是否為最后一頁
hasPreviousPageboolean是否有上一頁
hasNextPageboolean是否有下一頁

優點PageInfo對象包含了總頁數、總條數、是否有上一頁/下一頁等所有前端分頁組件需要的信息,一步到位。

2:強轉為 Page<T>

這種方式同樣非常流行,它提供了更高的自定義靈活性。

工作原理:當PageHelper.startPage()被調用后,PageHelper會確保緊跟其后的MyBatis查詢返回的List對象,其實際類型是com.github.pagehelper.PagePage類繼承自ArrayList,但額外包含了分頁信息(如總條數total)。

// 1. 開啟分頁
PageHelper.startPage(1, 10);// 2. mapper.list() 表面上返回的是 List<Emp>,
//    但其在運行時的真實類型是 Page<Emp>
List<Emp> empList = empMapper.list();// 3. 因此,可以安全地進行強制類型轉換
Page<Emp> page = (Page<Emp>) empList;
使用場景

Page<T> 主要用于需要高度自定義返回格式的場景。開發者通過將其強轉后,可以精確地提取出 totallist 數據,然后封裝進自己項目規定的 PageBeanResultVO 等DTO(數據傳輸對象)中,完全掌控API的響應結構。

優點:返回給前端的JSON結構完全由您自己定義,可以做到最精簡,不受PageInfo固定結構的限制。

核心屬性與方法

Page<T> 對象提供了獲取分頁所需的最基本、最核心的數據:

方法名返回類型說明
getTotal()long獲取總記錄數
getResult()List<T>獲取當前頁的數據列表 (等同于對象本身)
getPages()int獲取總頁數
getPageNum()int獲取當前頁碼
getPageSize()int獲取每頁顯示數量
getStartRow()long獲取當前頁的起始行號 (從1開始)
getEndRow()long獲取當前頁的結束行號

在這里插入圖片描述

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

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

相關文章

Gin框架:構建高性能Go Web應用

Gin框架&#xff1a;構建高性能Go Web應用 Gin是Go語言中最受歡迎的Web框架之一&#xff0c;以其高性能、簡潔API和豐富的中間件支持而聞名。本文將帶你從零開始&#xff0c;逐步掌握Gin框架的核心概念和高級特性&#xff0c;并通過實際代碼示例演示如何構建高效的Web應用程序。…

IO進程——線程、IO模型

一、線程Thread1、引入1.1 概念相當于是一個輕量級的進程&#xff0c;為了提高系統的性能引入線程&#xff0c;在同一進程中可以創建多個線程&#xff0c;共享進程資源1.2 進程和線程比較相同點&#xff1a;都為操作系統提供了并發執行的能力不同點&#xff1a;調度和資源&…

人工智能概念:NLP任務的評估指標(BLEU、ROUGE、PPL、BERTScore、RAGAS)

文章目錄一、評估指標基礎1. 準確率&#xff08;Accuracy&#xff09;2. 精確率&#xff08;Precision&#xff09;3. 召回率&#xff08;Recall&#xff09;4. F1-Score5. 示例二、文本生成專用指標1. BLEU&#xff1a;機器翻譯與標準化文案的“質量標尺”1.1 計算流程&#x…

團隊對 DevOps 理解不統一會帶來哪些問題

團隊對DevOps理念與實踐的理解不統一、片面甚至扭曲&#xff0c;是導致眾多企業DevOps轉型失敗的根本原因&#xff0c;它將直接引發一系列深層次的、相互關聯的嚴重問題。核心體現在&#xff1a;轉型極易淪為“為了工具而工具”的盲目自動化&#xff0c;導致最核心的文化變革被…

企業級實戰:構建基于Qt、C++與YOLOv8的模塊化工業視覺檢測系統(基于QWidget)

目錄一、概述二、項目目標與技術架構2.1 核心目標2.2 技術選型2.3 軟件架構三、AI推理DLL的開發 (Visual Studio 2019)3.1 定義DLL接口 (DetectorAPI.h)3.2 實現核心功能 (DetectorAPI.cpp)四、Qt Widget GUI應用程序的開發4.1 項目配置 (.pro 文件)4.2 UI設計 (mainwindow.ui)…

SVN自動化部署工具 腳本

SVN自動化部署工具 功能概述 這是一個自動化部署SVN倉庫的bash腳本&#xff0c;主要功能包括&#xff1a; 自動安裝SVN服務&#xff08;如未安裝&#xff09; 創建SVN項目倉庫 配置多用戶權限 設置自動同步到網站目錄 提供初始檢出功能 下載地址 https://url07.ctfile…

Facebook主頁變現功能被封?跨境玩家該如何申訴和預防

不少跨境玩家在運營Facebook公共主頁時&#xff0c;最期待的就是通過變現工具獲得穩定收入。但現實中&#xff0c;經常會遇到一個扎心的問題&#xff1a;主頁好不容易做起來&#xff0c;卻突然收到提示——“你的變現功能已被停用”。這意味著收入中斷&#xff0c;甚至可能導致…

安裝es、kibana、logstash

下載 elk 下載地址 elasticsearch地址: https://www.elastic.co/cn/downloads/elasticsearch kibana地址: https://www.elastic.co/cn/downloads/kibana logstash地址: https://www.elastic.co/cn/downloads/logstash 解壓elk 創建es全家桶文件夾 cd /usr/local mkdir elk …

Django admin 后臺開發案例【字段/圖片】

這是一個簡單的django admin 管理后臺,這個應用案例主要是給運營人員進行填寫數據 主要功能包括: 上傳圖片功能【選擇上傳時可以預覽】【替換已有數據中的圖片時可以預覽新舊圖片】 每條數據都將會記錄操作歷史。記錄操作人是誰?修改內容是什么?并且定位責任到某一員。 …

【C++】const和static的用法

目錄&#x1f680;前言&#x1f4bb;const&#xff1a;“只讀”的守護者&#x1f4af;修飾普通變量&#x1f4af;修飾指針&#x1f4af;修飾函數&#x1f4af;修飾類成員&#x1f4af;修飾對象&#x1f31f;static&#xff1a;“靜態存儲”與“作用域控制”&#x1f4af;修飾全…

F019 vue+flask海外購商品推薦可視化分析系統一帶一路【三種推薦算法】

文章結尾部分有CSDN官方提供的學長 聯系方式名片 B站up&#xff1a; 麥麥大數據 關注B站&#xff0c;有好處&#xff01; 編號: F019 關鍵詞&#xff1a;海外購 推薦系統 一帶一路 python 視頻 VueFlask 海外購電商大數據推薦系統源碼 &#xff08;三種推薦算法 全新界面布局…

【大數據專欄】流式處理框架-Apache Fink

Apache Fink 1 前言 1.1 功能 1.2 用戶 國際 國內 1.3 特點 ◆ 結合Java、Scala兩種語言 ◆ 從基礎到實戰 ◆ 系統學習Flink的核心知識 ◆ 快速完成從入門到上手企業開發的能力提升 1.4 安排 ◆ 初識Flink ◆ 編程模型及核心概念 ◆ DataSet API編程 ◆ Data…

向內核社區提交補丁

一、背景 內核的版本一直以來一直在持續迭代&#xff0c;離不開眾多開發者的貢獻。有時候我們會根據項目要求基于現有的內核版本開發一些新的功能或者修復掉一些特定場下的問題&#xff0c;我們是可以將其提交給社區的。 一般提交社區有兩個基本原則&#xff0c;一是提交的補…

TENGJUN-USB TYPE-C 24PIN測插雙貼連接器(H14.3,4腳插板帶柱):USB4.0高速傳輸時代的精密連接方案解析

在高速數據傳輸與多設備互聯需求日益增長的當下&#xff0c;USB TYPE-C接口憑借其可逆插拔、高兼容性的優勢成為主流&#xff0c;而TENGJUN推出的USB TYPE-C 24PIN測插雙貼連接器&#xff08;規格&#xff1a;H14.3&#xff0c;4腳插板帶柱&#xff09; &#xff0c;以對USB4.0…

企業級 Docker 應用:部署、倉庫與安全加固

1 Docker簡介及部署方法 1.1 Docker簡介 Docker之父Solomon Hykes&#xff1a;Docker就好比傳統的貨運集裝箱 Note 2008 年LXC(LinuX Contiainer)發布&#xff0c;但是沒有行業標準&#xff0c;兼容性非常差 docker2013年首次發布&#xff0c;由Docker, Inc開發1.1.1 什么是do…

rust語言 (1.88) 學習筆記:客戶端和服務器端同在一個項目中

同一項目下多個可執行文件&#xff0c;多個子項目參照以下&#xff1a; 一、項目目錄 項目/|-- client/|-- main.rs|-- Cargo.toml|-- server/|-- main.rs|-- Cargo.toml|-- Cargo.toml二、項目公共 Cargo.toml [workspace] # 定義Rust工作區配置 members …

mac本地安裝mysql

本人環境 macOs 14.5 1.下載安裝mysql https://dev.mysql.com/downloads/mysql/ 配置環境變量&#xff0c;打開terminal vim ~/.bash_profile 添加MYSQL_HOME/usr/local/mysql 在PATH中添加 通過mysql --version命令查看版本 2.開啟mysql 打開終端teminal,輸入命令 sudo…

面試前端遇到的問題

面試官讓我寫一個delay函數然后這是我寫的代碼async function delay(){setTimeout(function() {}, 3000); }面試官就和我說不是這個&#xff0c;用promise當時就蒙了&#xff0c;什么東西&#xff0c;為什么要用promise然后問豆包說Promise 是 JavaScript 中用于處理異步操作的…

Ubuntu Desktop 22.04.5 LTS 使用默認的 VNC 遠程桌面

1. 打開 VNC 打開設置 - 分享 - 遠程桌面2. 配置 VNC 打開遠程桌面 啟用vnc 選擇vnc密碼訪問 配置密碼3. 固定密碼 遠程桌面的訪問密碼在每次開機后會刷新一次&#xff0c;可以通過以下方式固定 打開【應用程序】&#xff0d;【附件】&#xff0d;密碼和加密密鑰&#xff08;或…

【無線安全實驗4】基于偽隨機數的WPS PIN碼逆向(精靈塵埃/仙塵攻擊)

文章目錄1 原理分析1.1 WPS連接過程1.1.1 初始階段1.1.2 注冊階段1.2 WPS攻擊原理1.2.1 在線攻擊1.2.2 離線攻擊1.2.2.1 Ralink模式1.2.2.2 eCos模式2 實驗過程3 參考資料在2011年 Stefan Viehbck 演示過WPS的在線暴力攻擊&#xff0c;由于PIN碼猜測最多只需11000種組合&#x…