MyBatis-Plus實現(xiàn)分頁查詢兩種方案詳解
方案一:PageUtils 工具類 分頁(ThreadLocal 封裝版)
1. 方案概述
PageUtils.startPage() 是項目統(tǒng)一封裝的分頁工具類,基于 MyBatis-Plus 分頁插件實現(xiàn),通過 ThreadLocal 存儲分頁參數(shù),對業(yè)務代碼無侵入,是傳統(tǒng)項目 / 老項目最常用的分頁方式。
2. 核心原理
- 調(diào)用
startPage()后,工具類自動獲取前端傳遞的頁碼、每頁條數(shù); - MyBatis-Plus 分頁插件攔截 SQL,自動拼接
LIMIT分頁語法; - 執(zhí)行查詢返回
List集合,工具類自動封裝成分頁結(jié)果集。
3. 適用場景
- 項目已統(tǒng)一封裝分頁工具類
- 不希望修改 Mapper/Service 層原有代碼
- 快速實現(xiàn)分頁,低成本改造
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;
/**
* 按范圍查詢案件聚合維度(賬齡+批次號/被告)
* 方案一:PageUtils 工具類分頁
*/
@GetMapping("/selectCaseDimensionByScope")
public R<JusticeCaseDimension> selectCaseDimensionByScope(JusticeCaseDimensionQuery caseDimensionQuery) {
// 1. 開啟分頁(核心:自動接收前端 page/pageSize 參數(shù))
PageUtils.startPage();
// 2. 執(zhí)行業(yè)務查詢,返回普通 List 集合
List<JusticeCaseDimension> justiceCaseDimensions = caseDimensionContext.selectCaseDimensionByScope(caseDimensionQuery);
// 3. 工具類封裝 List 為分頁結(jié)果返回
return R.page(justiceCaseDimensions);
}
}
4.2 Service/Mapper 層
無需任何分頁相關代碼,正常返回 List 即可。
二、方案二:MyBatis-Plus 原生 IPage 分頁(官方推薦)
1. 方案概述
IPage/Page 是 MyBatis-Plus 官方原生提供的分頁對象,直接通過方法入?yún)?/ 返回值實現(xiàn)分頁,代碼更簡潔、規(guī)范,是新項目首選方案。
2. 核心原理
- 前端傳遞分頁參數(shù)(page、pageSize),SpringMVC 自動封裝為
Page對象; - 將
Page對象傳入查詢方法,MyBatis-Plus 自動完成分頁查詢; - 直接返回
IPage對象,自帶總條數(shù)、總頁數(shù)、當前頁數(shù)據(jù)等完整分頁信息。
3. 適用場景
- 新項目開發(fā)、遵循官方規(guī)范
- 需要清晰的分頁參數(shù)傳遞
- 簡化代碼結(jié)構,降低維護成本
4. 完整代碼示例
4.1 Controller 層(業(yè)務接口)
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;
/**
* 按范圍查詢案件聚合維度(賬齡+批次號/被告)
* 方案二:原生 IPage 分頁(官方推薦)
*/
@GetMapping("/selectCaseDimensionByScope")
public R<IPage<JusticeCaseDimension>> selectCaseDimensionByScope(
// 分頁參數(shù):自動接收 page、pageSize
Page<JusticeCaseDimension> page,
JusticeCaseDimensionQuery caseDimensionQuery
) {
// 1. 直接傳入 Page 對象,返回 IPage 分頁結(jié)果
IPage<JusticeCaseDimension> pageResult = caseDimensionContext.selectCaseDimensionByScope(page, caseDimensionQuery);
// 2. 直接返回原生分頁對象
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);
三、兩種分頁方案核心對比
| 對比維度 | PageUtils 工具類分頁 | 原生 IPage 分頁 |
|---|---|---|
| 官方推薦度 | 非官方,項目自定義封裝 | ? MyBatis-Plus 官方標準 |
| 代碼侵入性 | 無侵入,無需修改原有接口 | 輕度侵入,需傳入 Page 對象 |
| 代碼簡潔度 | 需手動開啟分頁 + 封裝結(jié)果 | 一步到位,代碼極簡 |
| 分頁信息 | 工具類自動封裝 | 自帶完整分頁信息(總條數(shù) / 總頁數(shù)) |
| 適用項目 | 老項目、存量系統(tǒng)改造 | 新項目、標準化開發(fā) |
| 學習成本 | 低(直接調(diào)用工具方法) | 低(原生對象,無額外學習) |
四、最佳實踐建議
- 新項目優(yōu)先使用 原生 IPage 分頁:符合官方規(guī)范,代碼更易維護,團隊協(xié)作成本更低;
- 老項目保留 PageUtils 分頁:無需大規(guī)模改造代碼,兼容現(xiàn)有業(yè)務邏輯;
- 統(tǒng)一項目規(guī)范:一個項目中只使用一種分頁方案,避免代碼風格混亂。
到此這篇關于MyBatis-Plus實現(xiàn)分頁查詢兩種方案詳解的文章就介紹到這了,更多相關MyBatis-Plus分頁查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
詳解Java中格式化日期的DateFormat與SimpleDateFormat類
DateFormat其本身是一個抽象類,SimpleDateFormat 類是DateFormat類的子類,一般情況下來講DateFormat類很少會直接使用,而都使用SimpleDateFormat類完成,下面我們具體來看一下兩個類的用法:2016-05-05
java實現(xiàn)批量下載 多文件打包成zip格式下載
這篇文章主要為大家詳細介紹了java實現(xiàn)批量下載、將多文件打包成zip格式下載,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-07-07
關于notify()和notifyAll()方法的用法與區(qū)別
本文詳細解釋了Java中`notify()`和`notifyAll()`的區(qū)別,前者喚醒一個等待線程,后者喚醒所有等待線程,并提供了示例代碼,展示了`notify()`和`notifyAll()`在實際使用中的效果2026-04-04
java中如何判斷數(shù)組中是否包含某個元素的幾種方法
相信大家在操作Java的時候,經(jīng)常會要檢查一個數(shù)組(無序)是否包含一個特定的值,這篇文章主要給大家介紹了關于java中如何判斷數(shù)組中是否包含某個元素的幾種方法,需要的朋友可以參考下2024-08-08

