SpringBoot整合PageHelper實(shí)現(xiàn)分頁(yè)查詢功能
一、為什么需要分頁(yè)?
如果不進(jìn)行分頁(yè),那么就意味著要查詢和渲染數(shù)據(jù)庫(kù)中所有的符合條件的數(shù)據(jù),會(huì)出現(xiàn)查詢緩慢,渲染大量數(shù)據(jù)造成卡頓。
分頁(yè)查詢是解決上述問題的經(jīng)典方案。本文介紹在 Spring Boot + MyBatis 項(xiàng)目中,如何使用 PageHelper 快速實(shí)現(xiàn)分頁(yè)功能。
二、PageHelper 簡(jiǎn)介
PageHelper 是 MyBatis 生態(tài)中非常流行的分頁(yè)插件,它的核心優(yōu)勢(shì)在于:
1.操作簡(jiǎn)單,只需在查詢前調(diào)用 startPage(),無需修改原有 SQL。
2.自動(dòng)化,自動(dòng)攔截 SQL,拼接 LIMIT 語(yǔ)句并執(zhí)行 count 查詢,其原理就是幫你寫LIMIT語(yǔ)句。
3.易集成,提供 Spring Boot Starter,開箱即用。
三、環(huán)境搭建
在 pom.xml 中添加 PageHelper 的 Spring Boot Starter:
<!-- pageHelper 坐標(biāo) -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.6</version>
</dependency>為了前后端數(shù)據(jù)格式統(tǒng)一,定義一個(gè)通用的分頁(yè)結(jié)果類 PageBean:
public class PageBean<T> {
private Long total; // 總記錄數(shù)
private List<T> items; // 當(dāng)前頁(yè)數(shù)據(jù)列表
}total:告訴前端一共有多少條數(shù)據(jù),用于計(jì)算總頁(yè)數(shù)
items:當(dāng)前頁(yè)的具體數(shù)據(jù)
四、核心使用方式
十分簡(jiǎn)單,只需一行代碼就能開啟分頁(yè)查詢:
//開啟分頁(yè)查詢 PageHelp PageHelper.startPage(pageNum,pageSize); //直接進(jìn)入mapper層即可,pagehelper會(huì)自動(dòng)插入LIMIT語(yǔ)句 List<Article>as= articleMapper.list(userid,categoryId,state);
五、實(shí)戰(zhàn):文章列表分頁(yè)查詢
以項(xiàng)目中的文章列表查詢?yōu)槔?,完整展示?Controller 到 Mapper 的分頁(yè)實(shí)現(xiàn)鏈路。
Controller 層
接收前端傳來的分頁(yè)參數(shù)和查詢條件:
@GetMapping
public Result<PageBean<Article>> list(
Integer pageNum,
Integer pageSize,
@RequestParam(required = false) Integer categoryId,
@RequestParam(required = false) String state
) {
PageBean<Article> pb = articleService.list(pageNum, pageSize, categoryId, state);
return Result.success(pb);
}要點(diǎn)說明:
pageNum:當(dāng)前頁(yè)碼(從 1 開始)
pageSize:每頁(yè)顯示條數(shù)
categoryId 和 state 是業(yè)務(wù)查詢條件,使用 required = false 表示可選
注意返回值的類型。
Service 層
這是分頁(yè)邏輯的核心層:
@Override
public PageBean<Article> list(Integer pageNum, Integer pageSize,
Integer categoryId, String state) {
// 1. 創(chuàng)建 PageBean 對(duì)象
PageBean<Article> pb = new PageBean<>();
// 2. 開啟分頁(yè)查詢
PageHelper.startPage(pageNum, pageSize);
// 3. 調(diào)用 Mapper 查詢(此時(shí)返回的 List 實(shí)際是 Page 類型)
Map<String, Object> map = ThreadLocalUtil.get();
Integer userid = (Integer) map.get("id");
List<Article> as = articleMapper.list(userid, categoryId, state);
// 4. 強(qiáng)轉(zhuǎn)為 Page 對(duì)象,獲取分頁(yè)信息
Page<Article> p = (Page<Article>) as;
// 5. 封裝結(jié)果
pb.setTotal(p.getTotal());
pb.setItems(p.getResult());
return pb;
}第四步轉(zhuǎn)化的目的是使用Page類中的方法獲取具體的分頁(yè)信息,這個(gè)類是由Pagehelper提供的。
Mapper 層
正常寫就行,沒有什么變動(dòng):
<select id="list" resultType="org.example.pojo.Article">
select * from article
<where>
<if test="categoryId != null">
category_id = #{categoryId}
</if>
<if test="state != null">
and state = #{state}
</if>
and create_user = #{userid}
</where>
</select>PageHelper 會(huì)自動(dòng)完成兩件事:
執(zhí)行 count 查詢:SELECT COUNT(*) FROM article WHERE ...
拼接分頁(yè) SQL:在原 SQL 后添加 LIMIT offset, pageSize
六、PageHelper 工作原理(簡(jiǎn)述)
PageHelper 通過 MyBatis 的 Interceptor(攔截器) 機(jī)制,在執(zhí)行查詢時(shí)自動(dòng)改寫 SQL。startPage() 方法將分頁(yè)參數(shù)放入 ThreadLocal,確保同一線程中的下一次查詢被攔截處理。屬于AOP編程思想,但并不是通過SpringBoot的AOP實(shí)現(xiàn)的,而是基于MyBatis的攔截機(jī)制。
七、總結(jié)
通過 PageHelper,我們?cè)?Spring Boot 項(xiàng)目中實(shí)現(xiàn)了近乎零侵入的分頁(yè)功能:
加依賴:pagehelper-spring-boot-starter
封裝結(jié)果 : PageBean<T>
一行開啟 : PageHelper.startPage(pageNum, pageSize)
正常查詢 : Mapper SQL 無需改動(dòng)
進(jìn)行強(qiáng)轉(zhuǎn):List->Page
提取結(jié)果 : Page.getTotal() + Page.getResult()
這種設(shè)計(jì)讓分頁(yè)邏輯與業(yè)務(wù)代碼完全解耦,是我們?nèi)粘i_發(fā)中非常推薦的分頁(yè)方案。
以上就是SpringBoot整合PageHelper實(shí)現(xiàn)分頁(yè)查詢功能的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot PageHelper分頁(yè)查詢的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringBoot啟動(dòng)后立即執(zhí)行的幾種方法小結(jié)
在項(xiàng)目開發(fā)中某些場(chǎng)景必須要用到啟動(dòng)項(xiàng)目后立即執(zhí)行方式的功能,本文主要介紹了SpringBoot啟動(dòng)后立即執(zhí)行的幾種方法小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下2023-05-05
從零開始學(xué)java之二叉樹和哈希表實(shí)現(xiàn)代碼
這篇文章主要介紹了java之二叉樹和哈希表實(shí)現(xiàn)的相關(guān)資料,二叉查找樹和平衡二叉樹是二叉樹的兩種特殊形式,哈希表是一種通過哈希函數(shù)將數(shù)據(jù)與哈希值關(guān)聯(lián)起來的數(shù)據(jù)結(jié)構(gòu),可以快速查找數(shù)據(jù),文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-04-04
SpringBoot繼承LogStash實(shí)現(xiàn)日志收集的方法示例
這篇文章主要介紹了SpringBoot繼承LogStash實(shí)現(xiàn)日志收集的方法示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-05-05
Spring Boot 2.4新特性減少95%內(nèi)存占用問題
這篇文章主要介紹了Spring Boot 2.4新特性減少95%內(nèi)存占用問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12
解決JAVA遍歷List集合,刪除數(shù)據(jù)時(shí)出現(xiàn)的問題
這篇文章主要介紹了解決JAVA遍歷List集合時(shí),刪除數(shù)據(jù)出現(xiàn)的問題,文中講解非常細(xì)致,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07
Quarkus集成open api接口使用swagger ui展示
這篇文章主要為大家介紹了Quarkus集成open?api接口使用swagger?ui的展示示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-02-02

