<foreach>
是 MyBatis 提供的一个非常有用的动态 SQL 元素,它允许你遍历一个集合(如 List、Set 或数组),并在生成的 SQL 语句中插入相应的值。这对于构建包含 IN 子句的 SQL 查询特别有用,但也可以用于其他需要重复某些模式的情况。
<foreach>
标签的基本属性
-
collection:指定要遍历的集合名称。这个名称应该与传递给映射器方法的参数名相匹配。如果你使用的是命名参数(例如通过
@Param
注解),那么这里应该是命名参数的名字;如果是一个简单类型的列表作为参数,那么可以使用默认关键字list
。 -
item:表示当前迭代的元素别名。你可以用它在循环体内引用每个元素。
-
open 和 close:定义生成的 SQL 片段的开始和结束符号。例如,当你想要创建一个逗号分隔的列表时,可以设置
open="("
和close=")"
来包围整个列表。 -
separator:定义每个元素之间的分隔符。对于 IN 子句来说,通常是逗号
,
。 -
index(可选):当遍历 Map 类型的数据结构时,
index
表示键名,而item
表示对应的值。对于列表或数组,index
可以用来获取元素的位置索引。
<delete id="delete">
delete
from emp
where id in
<foreach collection="ids" item="id" separator="," open="(" close=")">
#{id}
</foreach>
</delete>
Controller层
@PathVariable List<Integer> ids
-
@PathVariable:此注解用于将 URL 中的模板变量绑定到方法参数上。例如,在路径
/delete/1,2,3
中,{ids}
将匹配1,2,3
这一部分。 -
List<Integer> ids:这里指定了我们希望将路径变量
{ids}
解析并转换成一个List<Integer>
类型的参数。Spring MVC 默认情况下并不直接支持将逗号分隔的字符串自动转换为列表,因此你需要确保请求 URL 的格式与你的预期一致,并且可能需要自定义解析逻辑或使用额外的配置来实现这一点。
@DeleteMapping("/{ids}")
public Result delete(@PathVariable List<Integer> ids) {
log.info("批量删除员工,ids:{}",ids);
empService.delete(ids);
return Result.success();
}
Service接口层
void delete(List<Integer> ids);
Service实现层
@Override
public void delete(List<Integer> ids) {
empMapper.delete(ids);
}
Mapper层
void delete(List<Integer> ids);
XML文件
<delete id="delete">
delete
from emp
where id in
<foreach collection="ids" item="id" separator="," open="(" close=")">
#{id}
</foreach>
</delete>