MyBatis-Plus實(shí)現(xiàn)分頁(yè)查詢兩種方案詳解
方案一:PageUtils 工具類(lèi) 分頁(yè)(ThreadLocal 封裝版)
1. 方案概述
PageUtils.startPage() 是項(xiàng)目統(tǒng)一封裝的分頁(yè)工具類(lèi),基于 MyBatis-Plus 分頁(yè)插件實(shí)現(xiàn),通過(guò) ThreadLocal 存儲(chǔ)分頁(yè)參數(shù),對(duì)業(yè)務(wù)代碼無(wú)侵入,是傳統(tǒng)項(xiàng)目 / 老項(xiàng)目最常用的分頁(yè)方式。
2. 核心原理
- 調(diào)用
startPage()后,工具類(lèi)自動(dòng)獲取前端傳遞的頁(yè)碼、每頁(yè)條數(shù); - MyBatis-Plus 分頁(yè)插件攔截 SQL,自動(dòng)拼接
LIMIT分頁(yè)語(yǔ)法; - 執(zhí)行查詢返回
List集合,工具類(lèi)自動(dòng)封裝成分頁(yè)結(jié)果集。
3. 適用場(chǎng)景
- 項(xiàng)目已統(tǒng)一封裝分頁(yè)工具類(lèi)
- 不希望修改 Mapper/Service 層原有代碼
- 快速實(shí)現(xiàn)分頁(yè),低成本改造
4. 完整代碼示例
4.1 Controller 層
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.List;
/**
* 案件維度管理 Controller
*/
@RestController
@RequestMapping("/justice/case/dimension")
public class JusticeCaseDimensionController {
@Resource
private CaseDimensionContext caseDimensionContext;
/**
* 按范圍查詢案件聚合維度(賬齡+批次號(hào)/被告)
* 方案一:PageUtils 工具類(lèi)分頁(yè)
*/
@GetMapping("/selectCaseDimensionByScope")
public R<JusticeCaseDimension> selectCaseDimensionByScope(JusticeCaseDimensionQuery caseDimensionQuery) {
// 1. 開(kāi)啟分頁(yè)(核心:自動(dòng)接收前端 page/pageSize 參數(shù))
PageUtils.startPage();
// 2. 執(zhí)行業(yè)務(wù)查詢,返回普通 List 集合
List<JusticeCaseDimension> justiceCaseDimensions = caseDimensionContext.selectCaseDimensionByScope(caseDimensionQuery);
// 3. 工具類(lèi)封裝 List 為分頁(yè)結(jié)果返回
return R.page(justiceCaseDimensions);
}
}
4.2 Service/Mapper 層
無(wú)需任何分頁(yè)相關(guān)代碼,正常返回 List 即可。
二、方案二:MyBatis-Plus 原生 IPage 分頁(yè)(官方推薦)
1. 方案概述
IPage/Page 是 MyBatis-Plus 官方原生提供的分頁(yè)對(duì)象,直接通過(guò)方法入?yún)?/ 返回值實(shí)現(xiàn)分頁(yè),代碼更簡(jiǎn)潔、規(guī)范,是新項(xiàng)目首選方案。
2. 核心原理
- 前端傳遞分頁(yè)參數(shù)(page、pageSize),SpringMVC 自動(dòng)封裝為
Page對(duì)象; - 將
Page對(duì)象傳入查詢方法,MyBatis-Plus 自動(dòng)完成分頁(yè)查詢; - 直接返回
IPage對(duì)象,自帶總條數(shù)、總頁(yè)數(shù)、當(dāng)前頁(yè)數(shù)據(jù)等完整分頁(yè)信息。
3. 適用場(chǎng)景
- 新項(xiàng)目開(kāi)發(fā)、遵循官方規(guī)范
- 需要清晰的分頁(yè)參數(shù)傳遞
- 簡(jiǎn)化代碼結(jié)構(gòu),降低維護(hù)成本
4. 完整代碼示例
4.1 Controller 層(業(yè)務(wù)接口)
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* 案件維度管理 Controller
*/
@RestController
@RequestMapping("/justice/case/dimension")
public class JusticeCaseDimensionController {
@Resource
private CaseDimensionContext caseDimensionContext;
/**
* 按范圍查詢案件聚合維度(賬齡+批次號(hào)/被告)
* 方案二:原生 IPage 分頁(yè)(官方推薦)
*/
@GetMapping("/selectCaseDimensionByScope")
public R<IPage<JusticeCaseDimension>> selectCaseDimensionByScope(
// 分頁(yè)參數(shù):自動(dòng)接收 page、pageSize
Page<JusticeCaseDimension> page,
JusticeCaseDimensionQuery caseDimensionQuery
) {
// 1. 直接傳入 Page 對(duì)象,返回 IPage 分頁(yè)結(jié)果
IPage<JusticeCaseDimension> pageResult = caseDimensionContext.selectCaseDimensionByScope(page, caseDimensionQuery);
// 2. 直接返回原生分頁(yè)對(duì)象
return R.ok(pageResult);
}
}
4.2 Service 層
/**
* Service 層方法
*/
public IPage<JusticeCaseDimension> selectCaseDimensionByScope(Page<JusticeCaseDimension> page, JusticeCaseDimensionQuery query) {
// 調(diào)用 Mapper,直接返回 IPage
return baseMapper.selectCaseDimensionByScope(page, query);
}
4.3 Mapper 層
/**
* Mapper 層方法
*/
IPage<JusticeCaseDimension> selectCaseDimensionByScope(Page<JusticeCaseDimension> page, @Param("query") JusticeCaseDimensionQuery query);
三、兩種分頁(yè)方案核心對(duì)比
| 對(duì)比維度 | PageUtils 工具類(lèi)分頁(yè) | 原生 IPage 分頁(yè) |
|---|---|---|
| 官方推薦度 | 非官方,項(xiàng)目自定義封裝 | ? MyBatis-Plus 官方標(biāo)準(zhǔn) |
| 代碼侵入性 | 無(wú)侵入,無(wú)需修改原有接口 | 輕度侵入,需傳入 Page 對(duì)象 |
| 代碼簡(jiǎn)潔度 | 需手動(dòng)開(kāi)啟分頁(yè) + 封裝結(jié)果 | 一步到位,代碼極簡(jiǎn) |
| 分頁(yè)信息 | 工具類(lèi)自動(dòng)封裝 | 自帶完整分頁(yè)信息(總條數(shù) / 總頁(yè)數(shù)) |
| 適用項(xiàng)目 | 老項(xiàng)目、存量系統(tǒng)改造 | 新項(xiàng)目、標(biāo)準(zhǔn)化開(kāi)發(fā) |
| 學(xué)習(xí)成本 | 低(直接調(diào)用工具方法) | 低(原生對(duì)象,無(wú)額外學(xué)習(xí)) |
四、最佳實(shí)踐建議
- 新項(xiàng)目?jī)?yōu)先使用 原生 IPage 分頁(yè):符合官方規(guī)范,代碼更易維護(hù),團(tuán)隊(duì)協(xié)作成本更低;
- 老項(xiàng)目保留 PageUtils 分頁(yè):無(wú)需大規(guī)模改造代碼,兼容現(xiàn)有業(yè)務(wù)邏輯;
- 統(tǒng)一項(xiàng)目規(guī)范:一個(gè)項(xiàng)目中只使用一種分頁(yè)方案,避免代碼風(fēng)格混亂。
到此這篇關(guān)于MyBatis-Plus實(shí)現(xiàn)分頁(yè)查詢兩種方案詳解的文章就介紹到這了,更多相關(guān)MyBatis-Plus分頁(yè)查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- MybatisPlus實(shí)現(xiàn)多表的關(guān)聯(lián)查詢,實(shí)現(xiàn)分頁(yè),多條件查詢?nèi)^(guò)程
- mybatisPlus實(shí)現(xiàn)多表連接分頁(yè)動(dòng)態(tài)查詢方式
- MybatisPlus一對(duì)多聯(lián)表查詢及分頁(yè)的解決過(guò)程
- MyBatis-Plus進(jìn)行分頁(yè)查詢優(yōu)化的實(shí)踐指南
- MyBatis-Plus聯(lián)表查詢及分頁(yè)代碼舉例
- Mybatisplus多表關(guān)聯(lián)分頁(yè)查詢多種實(shí)現(xiàn)方式
- mybatisplus 多表關(guān)聯(lián)條件分頁(yè)查詢的實(shí)現(xiàn)
相關(guān)文章
詳解Java中格式化日期的DateFormat與SimpleDateFormat類(lèi)
DateFormat其本身是一個(gè)抽象類(lèi),SimpleDateFormat 類(lèi)是DateFormat類(lèi)的子類(lèi),一般情況下來(lái)講DateFormat類(lèi)很少會(huì)直接使用,而都使用SimpleDateFormat類(lèi)完成,下面我們具體來(lái)看一下兩個(gè)類(lèi)的用法:2016-05-05
OpenFeign無(wú)法遠(yuǎn)程調(diào)用問(wèn)題及解決
文章介紹了在使用Feign客戶端時(shí)遇到的讀超時(shí)問(wèn)題,并分析了原因是系統(tǒng)啟動(dòng)時(shí)未先加載Nacos配置,為了解決這個(gè)問(wèn)題,建議將Nacos配置放在`bootstrap.yml`文件中,以便項(xiàng)目啟動(dòng)時(shí)優(yōu)先加載Nacos配置2024-11-11
java實(shí)現(xiàn)批量下載 多文件打包成zip格式下載
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)批量下載、將多文件打包成zip格式下載,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07
關(guān)于notify()和notifyAll()方法的用法與區(qū)別
本文詳細(xì)解釋了Java中`notify()`和`notifyAll()`的區(qū)別,前者喚醒一個(gè)等待線程,后者喚醒所有等待線程,并提供了示例代碼,展示了`notify()`和`notifyAll()`在實(shí)際使用中的效果2026-04-04
java中如何判斷數(shù)組中是否包含某個(gè)元素的幾種方法
相信大家在操作Java的時(shí)候,經(jīng)常會(huì)要檢查一個(gè)數(shù)組(無(wú)序)是否包含一個(gè)特定的值,這篇文章主要給大家介紹了關(guān)于java中如何判斷數(shù)組中是否包含某個(gè)元素的幾種方法,需要的朋友可以參考下2024-08-08
SpringBoot異步實(shí)現(xiàn)的8種方式
異步執(zhí)行對(duì)于開(kāi)發(fā)者來(lái)說(shuō)并不陌生,在實(shí)際的開(kāi)發(fā)過(guò)程中,很多場(chǎng)景多會(huì)使用到異步,本文主要介紹了SpringBoot異步實(shí)現(xiàn)的8種方式,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09
詳解 Java繼承關(guān)系下的構(gòu)造方法調(diào)用
這篇文章主要介紹了詳解 Java繼承關(guān)系下的構(gòu)造方法調(diào)用的相關(guān)資料,希望通過(guò)本文能幫助到大家,讓大家理解掌握這部分內(nèi)容,需要的朋友可以參考下2017-10-10

