MyBatis 的 <foreach> 标签中collection 属性
目录
一、在普通Maven工程中
依赖版本如下:
StudentDao 接口中定义了 deleteBatch 方法:
在 StudentDao.xml 中添加以下动态 SQL 语句
二、在普通spring-boot工程中
依赖版本如下:
EmpMapper接口中定义了delete方法:
在 EmpMapper.xml 中添加以下动态 SQL 语句
Spring Boot中的简化
三、总结
在 MyBatis 的 <foreach> 标签中,collection
属性用于指定要迭代的集合或数组。这个属性的值取决于传递给方法的参数类型以及参数的名称。
在使用SSM框架和spring-boot框架中不同点
一、在普通Maven工程中
依赖版本如下:
<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.17</version>
</dependency>
StudentDao
接口中定义了 deleteBatch
方法:
public interface StudentDao {int deleteBatch(List<String> ids);
}
在 StudentDao.xml
中添加以下动态 SQL 语句
<delete id="deleteBatch" parameterType="java.util.List">DELETE FROM studentsWHERE student_number IN<foreach collection="list" item="id" open="(" separator="," close=")">#{id}</foreach>
</delete>
- 默认参数名称:
- 当方法参数是一个单一对象(如
List<String>
)时,MyBatis 默认会将这个参数命名为list
。这是 MyBatis 的一个约定:- 如果参数是一个
List
,默认的参数名是list
。 - 如果参数是一个数组,默认的参数名是
array
。 - 如果参数是一个单一对象(非集合或数组),默认的参数名是
_parameter
。
- 如果参数是一个
- 当方法参数是一个单一对象(如
- 自定义参数名称:
-
如果你想使用自定义的参数名(如
ids
),可以通过在方法参数前添加@Param
注解来实现。例如:int deleteBatch(@Param("ids") List<String> ids);
然后在 XML 中使用
collection="ids"
:<foreach collection="ids" item="id" open="(" separator="," close=")">#{id} </foreach>
-
二、在普通spring-boot工程中
依赖版本如下:
<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.4</version>
</dependency>
EmpMapper接口中定义了delete方法:
public interface EmpMapper {void delete(List<Integer> ids);
}
在 EmpMapper.xml
中添加以下动态 SQL 语句
<!-- 批量 删除员工--><delete id="delete">delete from empwhere id in<foreach collection="ids" item="id" separator="," open="(" close=")">#{id}</foreach></delete>
Spring Boot中的简化
在Spring Boot工程中,你可以直接使用collection="ids"
是因为:
- 通常我们会使用
@Param
注解明确指定参数名,这样MyBatis就能识别 - Spring Boot的自动配置和MyBatis的整合更紧密,对参数名的处理更灵活
- 使用Map或DTO对象封装参数时,可以自定义参数名
collection="ids"
的情况:
1.当你将List包装在一个Map或对象中,并指定参数名为"ids"时
Map<String, List<Integer>> params = new HashMap<>();
params.put("ids", Arrays.asList(1, 2, 3));
mapper.deleteByIds(params);
2.或者使用@Param注解:
@Delete("<script>" +"DELETE FROM table WHERE id IN " +"<foreach collection='ids' item='id' open='(' separator=',' close=')'>" +"#{id}" +"</foreach>" +"</script>")
void deleteByIds(@Param("ids") List<Integer> ids);
三、总结
collection
属性的值取决于你如何传递参数给MyBatis,使用@Param
注解可以让你更自由地选择名称,而不需要依赖MyBatis的默认命名规则。
推荐使用@Param
注解明确指定集合参数名,
-
如果不使用
@Param
注解,对于List参数,MyBatis默认使用"list"作为键;对于数组参数,默认使用"array"作为键 -
保持一致性,避免在同一个项目中混用不同的命名方式