Spring Boot + MyBatis/MyBatis Plus:XML中循環處理List參數的終極指南

重要提醒:使用@Param注解時,務必導入正確的包!
import org.apache.ibatis.annotations.Param;
很多開發者容易錯誤導入Spring的@Param,導致參數綁定失敗!

一、為什么需要傳遞List參數?

最常見的場景是動態構建IN查詢

SELECT * FROM users WHERE id IN (1, 2, 3, 4)

當我們需要根據前端傳入的多個值查詢時,就需要將List集合作為參數傳遞給Mapper。


二、基礎版:MyBatis原生List傳參

1. Mapper接口定義(注意@Param導入)
// !!!必須導入MyBatis的@Param包!!!
import org.apache.ibatis.annotations.Param;public interface UserMapper {// 使用@Param注解指定參數名List<User> selectByIds(@Param("idList") List<Long> idList);
}
2. XML映射文件實現
<select id="selectByIds" resultType="User">SELECT * FROM usersWHERE id IN<foreach collection="idList" item="id" open="(" separator="," close=")">#{id}</foreach>
</select>
核心標簽解析:
屬性說明示例值
collection傳入的集合參數名idList
item循環中當前元素的別名id
open循環開始前的字符串(
separator元素間的分隔符,
close循環結束后的字符串)
3. 實際生成的SQL

當傳入List<Long> ids = Arrays.asList(1L, 2L, 3L)時:

SELECT * FROM users WHERE id IN (1, 2, 3)

三、避坑重點:@Param的正確使用

常見錯誤1:導入錯誤包
// ? 錯誤:導入了Spring的Param包
import org.springframework.data.repository.query.Param;// ? 正確:必須使用MyBatis的Param包
import org.apache.ibatis.annotations.Param;
常見錯誤2:忘記添加@Param注解
// ? 錯誤:缺少@Param注解會導致XML中無法識別參數
List<User> selectByIds(List<Long> idList);// ? 正確:必須添加@Param注解
List<User> selectByIds(@Param("idList") List<Long> idList);

四、MyBatis Plus的優雅實現

1. 使用QueryWrapper(無需XML)
public List<User> getUsersByIds(List<Long> ids) {return userMapper.selectList(new QueryWrapper<User>().in("id", ids));
}
2. Lambda表達式寫法(推薦)
public List<User> getUsersByIds(List<Long> ids) {return userMapper.selectList(Wrappers.<User>lambdaQuery().in(User::getId, ids));
}

注意:MyBatis Plus的Wrapper方式不需要@Param注解


五、擴展應用場景

場景1:List處理
// Mapper
List<User> selectByNames(@Param("nameList") List<String> nameList);// XML
<foreach collection="nameList" item="name" open="(" separator="," close=")">#{name}
</foreach>
場景2:List<實體對象>
// Mapper
List<User> selectByConditions(@Param("userList") List<User> userList);// XML
<foreach collection="userList" item="user" separator=" OR ">(name = #{user.name} AND age > #{user.age})
</foreach>
場景3:多List參數
// Mapper
List<User> searchUsers(@Param("ids") List<Long> ids, @Param("names") List<String> names);// XML
<where><if test="ids != null and !ids.isEmpty()">id IN<foreach collection="ids" item="id" open="(" separator="," close=")">#{id}</foreach></if><if test="names != null and !names.isEmpty()">AND name IN<foreach collection="names" item="name" open="(" separator="," close=")">#{name}</foreach></if>
</where>

六、特殊類型處理技巧

1. 枚舉類型處理
// Mapper
List<User> selectByStatus(@Param("statusList") List<UserStatus> statusList);// XML
<foreach collection="statusList" item="status" open="(" separator="," close=")">#{status, typeHandler=org.apache.ibatis.type.EnumTypeHandler}
</foreach>
2. 日期范圍查詢
// Mapper
List<User> selectByDates(@Param("dateList") List<Date> dates);// XML
<foreach collection="dateList" item="date" separator=" OR ">create_time BETWEEN #{date} AND DATE_ADD(#{date}, INTERVAL 1 DAY)
</foreach>

七、性能優化與避坑指南

1. 空集合安全處理
<select id="safeSelect">SELECT * FROM users<where><if test="idList != null and !idList.isEmpty()">id IN<foreach collection="idList" ... /></if></where>
</select>
2. 大數據量分批查詢
// 每500條執行一次查詢
public List<User> batchSelect(List<Long> allIds) {List<User> result = new ArrayList<>();int batchSize = 500;for (int i = 0; i < allIds.size(); i += batchSize) {List<Long> batchIds = allIds.subList(i, Math.min(i + batchSize, allIds.size()));result.addAll(userMapper.selectByIds(batchIds));}return result;
}
3. SQL注入防護
<!-- 安全寫法:使用#{}預編譯 -->
<foreach collection="names" item="name">#{name}  <!-- 安全 -->
</foreach><!-- 危險寫法:${}直接拼接 -->
<foreach collection="names" item="name">'${name}' <!-- 存在SQL注入風險! -->
</foreach>

八、完整可運行示例

Controller
@RestController
@RequestMapping("/users")
public class UserController {@PostMapping("/by-ids")public List<User> getUsersByIds(@RequestBody List<Long> ids) {return userService.getUsersByIds(ids);}
}
Service
@Service
@RequiredArgsConstructor
public class UserService {private final UserMapper userMapper;public List<User> getUsersByIds(List<Long> ids) {if (ids == null || ids.isEmpty()) {return Collections.emptyList();}// 超過1000條自動分批return ids.size() > 1000 ? batchSelect(ids) : userMapper.selectByIds(ids);}
}
Mapper XML
<mapper namespace="com.example.mapper.UserMapper"><select id="selectByIds" resultType="User">SELECT id, name, email FROM users<where><if test="idList != null and !idList.isEmpty()">id IN<foreach collection="idList" item="id" open="(" separator="," close=")">#{id}</foreach></if></where></select>
</mapper>

總結:核心要點回顧

  1. 必須使用正確的@Param包
    import org.apache.ibatis.annotations.Param;

  2. XML循環核心語法

    <foreach collection="參數名" item="元素名" open="開始符" separator="分隔符" close="結束符">#{元素名}
    </foreach>
    
  3. 最佳實踐選擇

    • 簡單查詢:MyBatis Plus Wrapper
    • 復雜SQL:MyBatis XML + foreach
    • 超大數據:分批查詢
  4. 安全防護

    • 始終使用#{}防止SQL注入
    • 空集合檢查避免全表掃描
  5. 特殊類型處理

    • 枚舉:添加typeHandler
    • 日期:指定jdbcType=TIMESTAMP

最后提醒: 當遇到參數綁定問題時,首先檢查@Param導入的包是否正確,這是最常見的錯誤根源!

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

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

相關文章

Design Compiler:自適應重定時(Adaptive Retiming)

相關閱讀 Design Compilerhttps://blog.csdn.net/weixin_45791458/category_12738116.html?spm1001.2014.3001.5482 簡介 重定時是DC Ultra引入的一種時序優化技術&#xff0c;可以將時序單元&#xff08;觸發器和鎖存器&#xff09;穿越組合邏輯前后移動&#xff0c;以優化設…

解決kali Linux在VMware中的全局縮放問題

在每次啟動kali時&#xff0c;因為屏幕分辨率過高&#xff0c;系統整體特別小&#xff0c;該怎么操作調整合適呢 在搜索中搜索kali HiDPI Mode 選擇yes 然后就會自動調整合適了

Python關鍵字梳理

在 Python 中&#xff0c;關鍵字&#xff08;Keywords&#xff09;是具有特殊含義的保留字&#xff0c;它們用于定義語法和結構。async 是 Python 3.5 引入的關鍵字&#xff0c;用于支持異步編程&#xff08;Asynchronous Programming&#xff09;。下面我將詳細講解 async 及其…

結構體實戰:用Rust編寫矩形面積計算器

文章目錄結構體實戰&#xff1a;用Rust編寫矩形面積計算器&#x1f4d0; 問題描述1?? 基礎版&#xff1a;獨立變量&#xff08;混亂版&#xff09;2?? 進階版&#xff1a;使用元組3?? 終極版&#xff1a;使用結構體&#xff08;優雅版&#xff09;&#x1f3af; 運行結果…

基于開源鏈動2+1模式AI智能名片S2B2C商城小程序的場景零售創新研究

摘要&#xff1a;本文聚焦場景消費邏輯&#xff0c;探討開源鏈動21模式AI智能名片S2B2C商城小程序在場景零售中的應用。通過分析場景消費中消費者體驗的關鍵作用&#xff0c;結合該技術組合的特性&#xff0c;闡述其如何優化場景內容、增強場景美感&#xff0c;為消費者創造超乎…

新發布:26考研院校和專業大綱

復習方向錯了&#xff0c;努力可能白費 近日&#xff0c;多所高校陸續發布2026年碩士研究生招生考試自命題科目大綱&#xff0c;為備考的學子們指明了復習方向。今年的考綱有哪些重要變化&#xff1f;又該如何應對&#xff1f;本文為你全面梳理&#xff01; 院校和專業發布詳情…

matlab/Simulink-全套50個汽車性能建模與仿真源碼模型9

50個simulink模型&#xff08;所有模型羅列如下&#xff0c;沒羅列就是沒有&#xff0c;包含子模塊總共50個。&#xff09; 基于汽車驅動力-行駛阻力平衡圖的汽車動力性仿真模型 基于汽車動力特性圖的汽車動力性仿真模型 基于汽車功率平衡圖的汽車動力性仿真模型 電動汽車動力…

為什么星敏感器(Star Tracker)需要時間同步?—— 從原理到應用的全解析

為什么星敏感器&#xff08;Star Tracker&#xff09;需要時間同步&#xff1f;—— 從原理到應用的全解析 引言 在衛星姿態控制系統中&#xff0c;星敏感器&#xff08;Star Tracker, 簡稱“星敏”&#xff09; 是最精確的姿態測量設備之一&#xff0c;其精度可達角秒級&…

【Cocos TypeScript 零基礎 24.1】

目錄 首次實戰開發心得實戰項目<修仙錄游戲> 首次實戰開發心得 遇到的技術問題也多 發表問題也不少 收入問題 本人都將會寫篇專欄總結一下 實戰項目<修仙錄游戲> 上圖是已上線的實戰項目二維碼 耗費的時間太久了 下次將跟新開發遇到的各種奇奇怪怪的問題 各位看…

Linux關機指令詳解:shutdown命令的使用指南

掌握shutdown命令的正確使用對于Linux系統管理員至關重要&#xff0c;它不僅能確保系統安全關閉&#xff0c;還能避免數據丟失和用戶工作中斷。 目錄 一、基本語法 二、常用選項 三、使用示例 立即關機 10分鐘后關機 指定時間關機&#xff08;如23:00&#xff09; 重啟系…

青少年編程與數學 02-022 專業應用軟件簡介 08 電子設計自動化軟件

青少年編程與數學 02-022 專業應用軟件簡介 08 電子設計自動化軟件一、什么是EDA軟件&#xff08;一&#xff09;定義與起源&#xff08;二&#xff09;功能與分類&#xff08;三&#xff09;技術發展趨勢二、EDA軟件在當前國際競爭中的重要性&#xff08;一&#xff09;技術壁…

TypeScript系列:第六篇 - 編寫高質量的TS類型

掌握這些&#xff0c;ts類型聲明事半功倍 &#x1f4aa;&#x1f3fb; 不要做 永遠不要使用類型 Number、String、Boolean、Symbol 或 Object 這些類型指的是非原始裝箱對象&#xff0c;使用 number、string、boolean 和 symbol 類型不要使用 any 作為類型&#xff0c;除非正在…

逐步構建高性能http服務器及聊天室服務器

目錄 如何拿到瀏覽器發來的http請求 如何給瀏覽器發送響應 響應基本原理 給瀏覽器發送一個網頁作為響應 給瀏覽器發送一個圖片作為響應 接下來我們要做什么 完善業務邏輯 瀏覽器如何訪問特定文件 訪問根目錄下的文件 訪問子文件夾下的文件 習慣性目錄結構 GET請求帶…

水下航行器外形分類詳解

在水下航行器的設計領域&#xff0c;外形是影響其性能和功能的關鍵因素之一。根據不同的設計目的和應用場景&#xff0c;水下航行器的外形可以按照多種方式進行分類。 本文將詳細介紹幾種常見的分類方式及其對應的外形特點。 按流體動力布局分類 標準回轉體 外形標準回轉體外…

Ubuntu:Mysql服務器

mariadb與mysql完全兼容&#xff0c;使用時感受不到差別 目錄 1 mariadb的安裝2 啟動mysql3 關閉防火墻4 連接到mysql5 Mysql的配置文件6 Mysql遠程訪問 1 mariadb的安裝 apt install mariadb-server檢查安裝 ls /etc/init.d2 啟動mysql service mysql restart3 關閉防火墻…

使用systemd 監控服務并實現故障自動重啟

一、為什么需要自動重啟&#xff1f; 在生產環境中&#xff0c;服務可能因內存溢出、資源競爭、外部依賴中斷等問題意外崩潰。手動恢復效率低下&#xff0c;而 systemd 的自動重啟機制可在秒級內恢復服務&#xff0c;顯著提升系統可用性。 ?? 二、systemd 自動重啟的核心配置…

在 React 中使用 WebSockets 構建實時聊天應用程序

實時通信已成為現代 Web 應用程序&#xff08;尤其是在聊天應用程序中&#xff09;不可或缺的功能。實時通信提供了一種強大的方法來實現客戶端和服務器之間的實時雙向通信。在本指南中&#xff0c;我們將逐步講解如何使用React WebSockets構建實時聊天應用程序。 先決條件 在…

實驗五-Flask的簡易登錄系統

一、實驗目的和任務 1.掌握Flask框架的基本使用方法 2.理解Web應用的會話管理機制 3.實現用戶認證系統的基本功能 4.學習模板繼承和表單處理技術 要求&#xff1a;請將思考題的答案寫在實驗報告中 二、實驗內容 1.基礎環境搭建&#xff1a;創建項目目錄結構、安裝必要依賴包…

WebSocket類明明注入了Bean,為什么報錯為null

在 WebSocket 類中注入 Bean 看似可行而注入 Bean 報錯為null&#xff0c;通常是由于Spring 的單例管理機制與 WebSocket 多實例創建特性沖突導致的&#xff0c;具體分析如下&#xff1a;原因分析Spring 的單例特性&#xff1a;Spring 默認以單例模式管理 Bean&#xff0c;即一…

Python 爬蟲開發指南:從基礎到實戰

在大數據時代&#xff0c;數據成為了寶貴的資源。Python 爬蟲作為高效獲取網絡數據的工具&#xff0c;受到越來越多開發者的關注。本文將詳細介紹 Python 爬蟲的相關知識&#xff0c;助你快速入門并掌握爬蟲開發的核心要點。 一、Python 爬蟲概述 Python 爬蟲&#xff0c;即網…