MyBatis動態SQL中foreach標簽的詳細使用手冊

mybatis中,標簽用于處理集合類型參數,適用于動態in查詢、批量插入等場景。其核心作用是對集合進行遍歷,并將每個元素以特定格式拼接到sql語句中。一、基本語法結構包括Collection(指定集合)、item(元素別名)、separator(分隔符)、open和close(生成內容前后添加的字符串)。二、常見使用場景有:1. in查詢,通過傳入list或Array構造in子句;2. 批量插入數據,適用于mysql、postgresql等支持多值插入的數據庫;3. 動態拼接多個or條件實現模糊匹配。三、collection屬性根據參數類型不同寫法各異:list用collection=”list”或具體名稱,數組用collection=”array”,map用collection=”map”。四、容易出錯的地方包括忘記加括號導致語法錯誤、參數名寫錯、忽略數據庫差異、誤用item屬性等。掌握關鍵屬性并注意細節可有效應對集合操作需求。

MyBatis動態SQL中foreach標簽的詳細使用手冊

在MyBatis中,標簽是處理集合類型參數的重要工具,尤其適用于構建動態IN查詢、批量插入等場景。它的核心作用是對傳入的集合進行遍歷,并將每個元素以特定格式拼接到sql語句中。

MyBatis動態SQL中foreach標簽的詳細使用手冊


一、標簽的基本語法結構

標簽有以下幾個常用屬性:

MyBatis動態SQL中foreach標簽的詳細使用手冊

  • collection:指定要遍歷的集合或數組,可以是List、Array、Map等。
  • item:指定集合中每個元素的別名,在循環體內使用。
  • separator:指定每次循環之間插入的分隔符,比如逗號。
  • open 和 close:可選,用于在生成內容前后添加字符串,如括號。

一個典型的寫法如下:

<foreach collection="ids" item="id" separator="," open="(" close=")">     #{id} </foreach>

這段代碼會生成類似 (1,2,3) 的結果,常用于 IN 查詢。

MyBatis動態SQL中foreach標簽的詳細使用手冊


二、常見使用場景及寫法示例

1. IN 查詢中的使用

當你需要根據一組ID查詢數據時,最常見的方式就是結合 使用 IN 子句:

<select id="selectByIds" resultType="User">     SELECT * FROM users     WHERE id IN     <foreach collection="ids" item="id" separator="," open="(" close=")">         #{id}     </foreach> </select>

傳入的參數是一個 List 或 Array,例如:[1, 2, 3],最終 SQL 會變成:

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

2. 批量插入數據

在執行批量插入時,也可以用 來構造 VALUES 部分:

<insert id="batchInsert">     INSERT INTO users (name, email)     VALUES     <foreach collection="userList" item="user" separator=",">         (#{user.name}, #{user.email})     </foreach> </insert>

注意:這種寫法依賴數據庫支持多值插入(mysql、PostgreSQL 支持),oracle 不支持這種方式,需要用其他方式處理。

3. 拼接條件語句

有時你可能想根據一個集合動態拼接多個 OR 條件:

<where>     <foreach collection="keywords" item="keyword" separator=" OR ">         name LIKE CONCAT('%', #{keyword}, '%')     </foreach> </where>

這樣就能實現多個關鍵詞模糊匹配的效果。


三、關于collection屬性的寫法細節

傳入參數的類型不同,collection 屬性的寫法也會有所不同:

參數類型 示例寫法
List collection=”list” 或具體名稱如 ids
數組 collection=”array” 或自定義名如 nums
Map collection=”map” 或 key 名如 userIds

如果你用了注解方式傳參,比如:

List<User> selectByIds(@Param("ids") List<Integer> ids);

xml 中就可以直接寫 collection=”ids”。


四、一些容易出錯的地方

  • 忘記加括號:IN 查詢時如果不加 open=”(” 和 close=”)”,會導致 SQL 語法錯誤。
  • 參數名寫錯:比如傳的是 userIdList,但寫了 collection=”ids”,就會找不到集合。
  • 不考慮數據庫差異:像 Oracle 不支持多值插入,強行使用 構造批量插入會導致失敗。
  • 誤用 item 屬性:在 item 中用了非法變量名或重復命名,會影響 SQL 解析。

基本上就這些,掌握好 標簽的幾個關鍵屬性和常見用法,就能應對大多數動態 SQL 中的集合操作需求了。不復雜但容易忽略細節,特別是參數傳遞方式和數據庫兼容性問題,建議開發時多測試幾種情況。

? 版權聲明
THE END
喜歡就支持一下吧
點贊5 分享