MyBatis-Plus 分頁失效問題解析:@Param 注解的影響與解決方案

引言

在 Spring Boot + MyBatis-Plus 的開發中,分頁查詢是常見的需求。

然而,有時我們會遇到分頁失效的問題,尤其是在方法參數上添加 @Param 注解后。

本文將通過一個實際案例,分析 @Param 注解如何影響 MyBatis-Plus 的分頁機制,并提供解決方案。


問題重現

1. 原始代碼

AlertServiceImpl 中,分頁查詢方法 page() 調用了 AlertDaolist() 方法:

@Override
public PageData<AlertDTO> page(Map<String, Object> params) {IPage<AlertEntity> page = getPage(params, null, false);List<AlertDTO> list = baseDao.list(params);return getPageData(list, page.getTotal(), AlertDTO.class);
}

AlertDaolist() 方法如下:

@DataSource(name = DataSourceNames.SECOND)
List<AlertDTO> list(@Param("p") Map<String, Object> params);

此時,分頁失效,SQL 查詢返回所有數據,而不是分頁后的結果。

2. 修復后的代碼

移除 @Param("p") 后,分頁恢復正常:

@DataSource(name = DataSourceNames.SECOND)
List<AlertDTO> list(Map<String, Object> params);

原因分析

1. MyBatis-Plus 的分頁機制

MyBatis-Plus 的分頁插件(PaginationInterceptor)會在執行 SQL 前自動解析分頁參數(如 pagesize),并修改 SQL 添加 LIMIT 子句。

2. @Param 注解的影響

  • 不加 @Param:MyBatis-Plus 能直接讀取 Map<String, Object> 中的分頁參數(如 params.get("page")),并正確分頁。
  • @Param("p"):整個 Map 被包裝成命名參數 p,MyBatis-Plus 無法直接訪問 p.pagep.size,導致分頁插件無法識別分頁參數,最終 SQL 沒有 LIMIT 子句,返回全部數據。

解決方案

方案 1:移除 @Param 注解(推薦)

@DataSource(name = DataSourceNames.SECOND)
List<AlertDTO> list(Map<String, Object> params);

優點

  • 保持 MyBatis-Plus 默認分頁行為,無需額外修改 SQL。
  • 代碼簡潔,符合 MyBatis-Plus 最佳實踐。

方案 2:手動分頁(適用于必須使用 @Param 的情況)

如果必須使用 @Param,可以在 XML 中手動添加 LIMIT

<select id="list" resultType="io.installer.modules.sys.dto.AlertDTO">SELECT ...<where>hd.is_deleted=0</where>LIMIT #{p.page}, #{p.size}
</select>

缺點

  • 需要手動計算分頁偏移量,容易出錯。
  • 不適用于所有數據庫(如 Oracle 需要使用 ROWNUM)。

方案 3:改用 IPage 參數(最佳 MyBatis-Plus 實踐)

@DataSource(name = DataSourceNames.SECOND)
List<AlertDTO> list(IPage<AlertDTO> page, @Param("query") Map<String, Object> params);

優點

  • MyBatis-Plus 自動處理分頁邏輯,無需手動干預。
  • 支持更靈活的分頁查詢。

總結

方案

適用場景

優點

缺點

移除 @Param

一般情況

簡單高效

無法自定義參數名

手動分頁

必須使用 @Param

可控性強

需要手動計算分頁

IPage 參數

復雜分頁查詢

符合 MyBatis-Plus 最佳實踐

需要調整方法簽名

最佳實踐建議

  • 優先移除 @Param**,讓 MyBatis-Plus 自動處理分頁。
  • 如需自定義參數名,可改用 IPage 參數 + @Param 組合。

結論

在 MyBatis-Plus 中,@Param 注解有時會干擾分頁插件的參數解析機制,導致分頁失效。通過移除 @Param 或改用 IPage 參數,可以確保分頁功能正常工作。理解 MyBatis-Plus 的分頁機制,有助于避免類似問題,提高開發效率。

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

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

相關文章

機器學習——模型的簡單優化

在訓練模型時我們可能會遇到模型不滿足于預期需要進行改善的環節&#xff0c;這些情況通常包括以下幾種常見問題和對應的解決方案&#xff1a;數據質量不足數據量過少&#xff1a;當訓練樣本不足時&#xff0c;模型難以學習到有效的特征表示。建議通過數據增強&#xff08;如圖…

17.MariaDB 數據庫管理

17.MariaDB 數據庫管理 數據庫介紹 數據庫&#xff08;Database&#xff09;簡單來說&#xff0c;就是按照一定規則存數據的 “倉庫”。它能高效存大量數據&#xff0c;還能方便地查、增、改、刪數據&#xff0c;是各種信息系統的核心。 核心特點: 結構化存儲&#xff1a;數…

AI搶飯碗,軟件測試該何去何從?

AI 浪潮下&#xff0c;軟件測試路在何方 當某大廠宣布 “AI 測試機器人上崗首日就覆蓋 80% 的功能測試” 時&#xff0c;測試圈炸開了鍋 —— 有人連夜更新簡歷&#xff0c;有人在技術論壇發問&#xff1a;“十年測試經驗&#xff0c;難道真的不如一行 AI 代碼&#xff1f;”AI…

09 ABP Framework 中的 MVC 和 Razor Pages

ABP Framework 中的 MVC 和 Razor Pages 該頁面詳細介紹了 ABP Framework 與 ASP.NET Core MVC 和 Razor Pages 的集成&#xff0c;涵蓋框架組件、項目模板、主題系統和模塊集成模式等內容&#xff0c;提供了 ABP 應用程序中傳統的服務器端 Web UI 選項。 框架集成組件 ABP 提供…

docker 容器內編譯onnxruntime

docker run -itd -p 49142:49142 --gpus "device0" --name cpp_env_20250812 --shm-size"5g" -v /本地路徑/onnxruntime:/onnxruntime nvidia/cuda:11.8.0-cudnn8-devel-ubuntu20.04進入容器內安裝必要的依賴git clone --branch v1.13.1 --recursive https…

-bash: ll: 未找到命令

“ll” 并不是 Linux 系統的原生命令&#xff0c;而是 “ls -l” 命令的一個常用別名&#xff08;快捷方式&#xff09;。提示 “-bash: ll: 未找到命令” 說明你的系統中沒有配置這個別名&#xff0c;只需手動添加即可&#xff1a;步驟&#xff1a;添加 ll 別名編輯當前用戶的…

docker network 與host的區別

所以docker run的時候只需要加入指定的network&#xff0c;就會從該network自動分配對應的ip是嗎 是的&#xff0c;你的理解完全正確&#xff01; Docker 網絡自動分配 IP 機制 當你使用 docker run 命令并指定網絡時&#xff0c;Docker 會自動從該網絡的子網中分配一個 IP 地址…

GPT-5 現已上線 DigitalOcean Gradient? AI 平臺!

OpenAI 于 8 月 7 日發布其最新人工智能模型 GPT-5。根據 OpenAI 介紹&#xff0c;GPT-5 在編程、數學、寫作、視覺等方面的性能全面領先&#xff0c;幻覺更低&#xff0c;指令更準。新架構整合高速模型與深度推理&#xff0c;可實時切換速答或深思。近日&#xff0c;DigitalOc…

#C語言——學習攻略:自定義類型路線--結構體--結構體類型,結構體變量的創建和初始化,結構體內存對齊,結構體傳參,結構體實現位段

&#x1f31f;菜鳥主頁&#xff1a;晨非辰的主頁 &#x1f440;學習專欄&#xff1a;《C語言學習》 &#x1f4aa;學習階段&#xff1a;C語言方向初學者 ?名言欣賞&#xff1a;“人理解迭代&#xff0c;神理解遞歸。” 目錄 1. 結構體類型 1.1 舊知識回顧 1.1.1 結構體聲…

機器學習——TF-IDF算法

TF-IDF&#xff08;Term Frequency-Inverse Document Frequency&#xff09;是一種廣泛應用于文本挖掘和信息檢索領域的經典加權算法&#xff0c;主要用于評估一個詞語在文檔集合中的重要程度。其核心思想是&#xff1a;一個詞語在文檔中出現的頻率越高&#xff0c;同時在所有文…

區塊鏈技術原理(9)-什么是以太幣

文章目錄前言什么是加密貨幣&#xff1f;什么是以太幣&#xff08;ETH&#xff09;鑄造 ETH燃燒 ETHETH 面額傳輸 ETH查詢 ETH以太幣的經濟模型&#xff1a;發行與流通以太幣與其他代幣的區別以太幣的歷史與市場地位總結前言 以太幣&#xff08;Ether&#xff0c;簡稱 ETH&…

【Oracle APEX開發小技巧16】交互式網格操作內容根據是否啟用進行隱藏/展示

在日常開發中&#xff0c;有想要根據某一狀態或條件去限制/隱藏對應權限或操作按鈕的情況&#xff0c;于是用簡報模板列表進行展示&#xff0c;并提供以下功能&#xff1a;顯示模板基本信息提供啟用/禁用模板的開關提供編輯模板的入口根據模板狀態顯示不同的操作選項效果展示&a…

AIStarter:全網唯一跨平臺桌面AI管理工具,支持Windows、Mac和Linux一鍵部署

AIStarter作為全網唯一支持Windows、Mac和Linux的桌面AI管理平臺&#xff0c;為開發者提供高效的項目管理、模型插件和工作流共享體驗。最近&#xff0c;熊哥發布了4.1.0版本更新視頻&#xff0c;詳細演示了如何在多平臺上安裝、使用和分享AI項目。本文基于視頻內容&#xff0c…

AP模式/ESP32作為TCP服務端,轉發串口接收的數據給網絡調試助手

此代碼為接收STM32的數據然后直接轉發到網絡調試助手,當有設備連接到esp32軟件熱點時會通過串口發送字符’a’給STM32,當有設備斷開連接時會通過串口發送字符’b’,ESP32的TX:GPIO4, RX:GPIO5ESP32作為TCP服務器地址為192.168.4.1 監聽端口為3333#include <string.h> #in…

kafka 中的Broker 是什么?它在集群中起什么作用?

Kafka中的Broker&#xff1a;集群的核心支柱 在分布式消息系統Apache Kafka中&#xff0c;Broker是構成Kafka集群的核心節點或服務器。 簡單來說&#xff0c;每一個Broker就是運行著Kafka服務的一個實例&#xff0c;多臺Broker共同協作&#xff0c;形成了強大的、可擴展的消息處…

【SOA用于噪聲抑制】光纖DFB激光器中弛豫振蕩噪聲抑制

概述&#xff1a;本章記錄了我們在光纖分布式反饋DFB激光器中使用飽和SOA來降低RIN的工作&#xff0c;以用于低頻傳感器應用。結果表明&#xff0c;放大器的增益動力學允許光纖激光器的弛豫振蕩RO噪聲分量減少30dB。 1 背景到目前為止&#xff0c;我研究了將飽和半導體光放大器…

神經網絡的核心組件解析:從理論到實踐

神經網絡作為深度學習的核心技術&#xff0c;其復雜性常常令人望而卻步。然而&#xff0c;盡管神經網絡的結構、參數和計算過程看似繁瑣&#xff0c;但其核心組件卻是相對簡潔且易于理解的。本文將深入探討神經網絡的四大核心組件——層、模型、損失函數與優化器&#xff0c;并…

Spring Boot項目通過Feign調用三方接口的詳細教程

目錄 一、環境準備 二、啟用Feign客戶端 三、定義Feign客戶端接口 四、定義請求/響應DTO 五、調用Feign客戶端 六、高級配置 1. 添加請求頭&#xff08;如認證&#xff09; 2. 超時配置&#xff08;application.yml&#xff09; 3. 日志配置 七、錯誤處理 自定義錯誤…

ubuntu24.04安裝 bpftool 以及生成 vmlinux.h 文件

文章目錄前言一、apt安裝二、源碼安裝三、生成vmlinux.h參考資料前言 $ cat /etc/os-release PRETTY_NAME"Ubuntu 24.04.2 LTS"$ uname -r 6.14.0-27-generic一、apt安裝 安裝bpftool&#xff1a; $ sudo apt install linux-tools-commonThe following NEW packa…

Pytorch FSDP權重分片保存與合并

注&#xff1a;本文章方法只適用Pytorch FSDP1的模型&#xff0c;且切分策略為SHARDED_STATE_DICT場景。 在使用FSDP訓練模型時&#xff0c;為了節省顯存通常會把模型權重也進行切分&#xff0c;在保存權重時為了加速保存通常每個進程各自保存自己持有的部分權重&#xff0c;避…