在mybatis中,
在MyBatis中,
一、標簽的基本語法結構
- collection:指定要遍歷的集合或數組,可以是List、Array、Map等。
- item:指定集合中每個元素的別名,在循環體內使用。
- separator:指定每次循環之間插入的分隔符,比如逗號。
- open 和 close:可選,用于在生成內容前后添加字符串,如括號。
一個典型的寫法如下:
<foreach collection="ids" item="id" separator="," open="(" close=")"> #{id} </foreach>
這段代碼會生成類似 (1,2,3) 的結果,常用于 IN 查詢。
二、常見使用場景及寫法示例
1. IN 查詢中的使用
當你需要根據一組ID查詢數據時,最常見的方式就是結合
<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. 批量插入數據
在執行批量插入時,也可以用
<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 解析。
基本上就這些,掌握好