MyBatis标签 <foreach> 遍历插入
时间: 2023-05-31 14:06:25 浏览: 219
MyBatis的<foreach>标签可以用来遍历一个集合,然后插入多条记录到数据库中。
下面是一个示例,它将遍历一个List集合,然后将集合中的每个元素插入到数据库中。
```
<insert id="batchInsert" parameterType="java.util.List">
INSERT INTO user (name, age)
VALUES
<foreach collection="list" item="user" separator=",">
(#{user.name}, #{user.age})
</foreach>
</insert>
```
在上面的示例中,<insert>标签的parameterType属性指定了参数类型为java.util.List。然后,<foreach>标签的collection属性指定了要遍历的集合,item属性指定了集合中每个元素的名称,separator属性指定了每个元素之间的分隔符。
<foreach>标签中的SQL语句会被遍历多次,每次遍历都会插入一条记录到数据库中。在插入时,会使用集合中的每个元素的属性值来填充SQL语句中的参数。例如,#{user.name}会被替换为集合中每个元素的name属性值。
相关问题
MyBatis用标签 <foreach> <trim>写一个遍历插入
假设我们有一个List<Student>对象,每个Student对象包含id和name属性,需要将其插入到数据库中,可以使用MyBatis的<foreach>和<trim>标签实现:
```
<insert id="batchInsertStudents" parameterType="java.util.List">
insert into student (id, name)
values
<trim suffixOverrides=",">
<foreach collection="list" item="student" separator=",">
(#{student.id}, #{student.name})
</foreach>
</trim>
</insert>
```
上面的SQL语句使用了<foreach>标签遍历List<Student>对象,使用<trim>标签去除最后一个逗号。其中,collection属性指定要遍历的集合,item属性指定集合中的元素在循环中的名称,separator属性指定每个元素之间的分隔符。#{student.id}和#{student.name}表示Student对象中的id和name属性。最终生成的SQL语句类似如下:
```
insert into student (id, name)
values
(1, '张三'),
(2, '李四'),
(3, '王五')
```
mybatis <foreach> <script>
### MyBatis `<foreach>` 和 `<script>` 标签详解
#### `<foreach>` 标签的使用方法
`<foreach>` 是 MyBatis 提供的一个非常有用的标签,用于遍历集合对象,在 SQL 语句中动态生成重复部分的内容。此标签主要应用于 `IN` 子句或其他需要多次插入相同模式参数的地方。
- **item**: 表示当前迭代项的名字。
- **index**: 当前索引名(可选),如果提供了 index 属性,则可以访问到每次迭代的位置信息。
- **collection**: 被迭代的对象名称,默认情况下对于 List 类型来说是 list;而对于数组则是 array。
- **open**, **close**: 定义整个列表开始和结束时附加的文字字符序列。
- **separator**: 各元素之间的分隔符[^1]。
下面给出一个简单的例子来展示如何利用 `<foreach>` 实现批量删除:
```xml
<!-- 删除多个记录 -->
<delete id="batchDelete">
DELETE FROM users
WHERE user_id IN
<foreach collection="ids" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
```
这段代码将会根据传入的 ID 列表构建出形如 `DELETE FROM users WHERE user_id IN (1,2,3)` 的 SQL 语句[^4]。
#### `<script>` 动态 SQL 支持
为了简化复杂的条件逻辑编写工作,MyBatis 还引入了 `<script>` 标签配合其他内置标签一起使用,比如 `<if>`, `<choose>`, `<when>`, `<otherwise>` 等等。通过这种方式可以在不改变原有 Mapper 文件结构的前提下灵活控制最终发送给数据库执行的具体命令字符串[^3]。
这里有一个综合运用上述两个概念的例子——假设我们想要实现一个可以根据不同情况选择性更新某些字段的功能:
```xml
<update id="conditionalUpdateUser">
UPDATE t_user SET
<trim prefix="SET" suffixOverrides=",">
<if test="username != null"> username=#{username}, </if>
<if test="email != null"> email=#{email} ,</if>
</trim>
WHERE id = #{userId};
</update>
<select id="selectUsersWithConditions">
SELECT *
FROM users u
<where>
<foreach collection="listOfIds" item="id" open="AND (" close=")" separator="OR ">
u.id = #{id}
</foreach>
</where>
</select>
```
第一个片段展示了怎样有条件地设置待修改列值;第二个则示范了结合 `<foreach>` 来构造复杂查询条件的方式。
阅读全文
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![-](https://img-home.csdnimg.cn/images/20241231044901.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)