主要介绍了mybatis 中 foreach collection的用法小结(三种),需要的朋友可以参考下。
foreach主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。
foreach元素的属性主要有 item,index,collection,open,separator,close。
item表示集合中每一个元素进行迭代时的别名,
index指 定一个名字,用于表示在迭代过程中,每次迭代到的位置,
open表示该语句以什么开始,
separator表示在每次进行迭代之间以什么符号作为分隔 符,
close表示以什么结束。
在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况 下,该属性的值是不一样的,主要有一下3种情况:
- 如果是单参数且参数类型是一个 List,则
collection
应该设为"list"
。 - 如果是单参数且参数类型是一个数组,则
collection
应该设为"array"
。 - 如果有多个参数,它们会被封装成一个 Map,此时
collection
应该设为这个 Map 中对应集合类型的 key 名称。
示例中,dishFlavorMapper.insert(flavors)
方法接收了一个 List<DishFlavor>
参数 flavors
。由于这是一个单参数且参数类型是一个 List,所以 <foreach>
标签中的 collection
应该被设置为 "list"
。这里写成flavors是错误的。
Mapper 接口
public interface DishFlavorMapper {
void insert(List<DishFlavor> flavors);
}
XML 映射文件
<insert id="insert">
insert into dish_flavor (name, value, dish_id) values
<foreach collection="list" item="df" separator=",">
(#{df.name}, #{df.value}, #{df.dishId})
</endforeach>
</insert>
Service 层代码
List<DishFlavor> flavors = dishDTO.getFlavors();
if (flavors != null && !flavors.isEmpty()) {
flavors.forEach(dishFlavor -> dishFlavor.setDishId(dishId));
dishFlavorMapper.insert(flavors);
}
解释
collection="list"
:因为传入的是一个 List 类型的参数,所以在<foreach>
标签中使用collection="list"
是正确的。item="df"
:这是用来表示每次迭代的对象,这里命名为df
,可以根据实际情况命名。separator=","
:这是用来分割每次迭代生成的部分,这里用逗号作为分隔符。