mybatis <forEach>标签的使用

本文详细介绍了 MyBatis 中 &lt;forEach&gt; 标签的用法及其应用场景,通过实例展示了如何利用该标签进行 SQL 动态拼接,提高 SQL 查询的灵活性与复用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

mybatis <forEach>标签的使用

http://blog.youkuaiyun.com/m0_37204491/article/details/71436872

MyBatis 的 `<foreach>` 标签用于在 SQL 语句中遍历集合(如 `List`、`Set`、数组等),常用于动态生成 `IN` 条件、批量插入或批量更新。以下是详细用法和示例: --- ### **1. 基本语法** ```xml <foreach collection="集合参数名" item="当前元素变量名" index="索引变量名" open="开始符号" separator="分隔符" close="结束符号"> #{当前元素变量名} </foreach> ``` - **`collection`**:要遍历的集合参数名(如 `list`、`array` 或 `@Param` 注解指定的名称)。 - **`item`**:当前元素的变量名,在循环体内使用。 - **`index`**(可选):当前元素的索引(从 0 开始)。 - **`open`/`close`**(可选):循环开始和结束时拼接的字符串。 - **`separator`**(可选):元素间的分隔符。 --- ### **2. 常见使用场景** #### **(1) 动态 `IN` 条件** ```xml <select id="selectUsersByIds" resultType="User"> SELECT * FROM user WHERE id IN <foreach collection="ids" item="id" open="(" separator="," close=")"> #{id} </foreach> </select> ``` **Java 调用**: ```java List<Integer> ids = Arrays.asList(1, 2, 3); List<User> users = sqlSession.selectList("selectUsersByIds", ids); ``` **生成的 SQL**: ```sql SELECT * FROM user WHERE id IN (1, 2, 3) ``` --- #### **(2) 批量插入** ```xml <insert id="batchInsertUsers"> INSERT INTO user (name, age) VALUES <foreach collection="users" item="user" separator=","> (#{user.name}, #{user.age}) </foreach> </insert> ``` **Java 调用**: ```java List<User> users = Arrays.asList( new User("Alice", 25), new User("Bob", 30) ); sqlSession.insert("batchInsertUsers", users); ``` **生成的 SQL**: ```sql INSERT INTO user (name, age) VALUES ('Alice', 25), ('Bob', 30) ``` --- #### **(3) 动态 `UPDATE` 多字段** ```xml <update id="updateUserSelective"> UPDATE user <set> <foreach collection="params" item="value" index="key" separator=","> ${key} = #{value} </foreach> </set> WHERE id = #{id} </update> ``` **Java 调用**: ```java Map<String, Object> params = new HashMap<>(); params.put("name", "Alice"); params.put("age", 26); sqlSession.update("updateUserSelective", params); ``` **生成的 SQL**: ```sql UPDATE user SET name = 'Alice', age = 26 WHERE id = 1 ``` --- ### **3. 注意事项** 1. **集合参数名**: - 如果参数是 `List` 且未通过 `@Param` 注解命名,默认用 `list` 作为键。 - 数组默认用 `array` 作为键。 - 建议显式使用 `@Param` 注解: ```java List<Integer> selectUsersByIds(@Param("ids") List<Integer> ids); ``` 2. **SQL 注入风险**: - 在 `index` 或动态表名/列名时使用 `${}`(直接拼接),但需确保值可信。 - 参数值务必用 `#{}`(预编译)。 3. **性能优化**: - 批量操作时,MySQL 默认不支持多值 `INSERT` 超过 `max_allowed_packet`,需分批处理。 4. **Oracle 批量插入**: Oracle 需用 `INSERT ALL` 语法: ```xml <insert id="batchInsertOracle"> INSERT ALL <foreach collection="users" item="user"> INTO user (id, name) VALUES (#{user.id}, #{user.name}) </foreach> SELECT 1 FROM DUAL </insert> ``` --- ### **4. 完整示例** #### **Mapper 接口** ```java public interface UserMapper { List<User> selectUsersByIds(@Param("ids") List<Integer> ids); int batchInsertUsers(@Param("users") List<User> users); } ``` #### **XML 映射文件** ```xml <mapper namespace="com.example.mapper.UserMapper"> <!-- IN 查询 --> <select id="selectUsersByIds" resultType="User"> SELECT * FROM user WHERE id IN <foreach collection="ids" item="id" open="(" separator="," close=")"> #{id} </foreach> </select> <!-- 批量插入 --> <insert id="batchInsertUsers"> INSERT INTO user (name, age) VALUES <foreach collection="users" item="user" separator=","> (#{user.name}, #{user.age}) </foreach> </insert> </mapper> ``` --- ### **5. 常见问题** - **Q**: 为什么 `IN` 条件报错? **A**: 检查 `collection` 名称是否匹配,或参数是否为 `null`/空集合。 - **Q**: 批量插入失败如何调试? **A**: 开启 MyBatis 日志(`logImpl=STDOUT_LOGGING`)查看生成的 SQL。 - **Q**: 如何遍历 `Map`? **A**: 使用 `entry` 遍历键值对: ```xml <foreach collection="map" item="value" index="key" separator=","> ${key} = #{value} </foreach> ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值