<foreach> 类似JAVA中的for循环,可以遍历集合或数组。 <foreach> 有如下属性:
collection :遍历的对象类型(数组、List、Map)
open :表示该语句以什么开始,常用 “(”;
close : 表示以什么结束,常用 “)”。
separator :表示在每次进行迭代之间以什么符号作为分隔符,常用 “,”;
item :表示集合中每一个元素进行迭代时的别名,随便起的变量名,遍历 map 时表示键值对的值。
index :遍历 List 、数组时表示遍历的索引位置,遍历 map 时表示键值对的键。
collection 属性是在使用foreach的时候最容易出错的,该属性是必须指定的,但是在不同场景下,该属性的配置是不一样的,常用的主要有3种情况:
1.<foreach>标签迭代Array数组
collection传入array即可!
// 4.批量删除指定id的一些数据,测试动态SQL的<foreach>标签,遍历Array
// 按给定的id值进行批量删除数据,传入一个数组,数组中包含要删掉的id值
// 系统的删除语句:delete from user where id in(12,13,14,16,17,18)
// 用途:测试<foreach>标签,遍历Array数组
void deleteBatch(int[] ids);
<!--4.批量删除指定id的一些数据,测试动态SQL的<foreach>标签,遍历Array-->
<!-- collection:遍历的对象类型
open:开始的sql语句
close:结束的sql语句
separator:遍历每项间的分隔符(自定义分隔符形式形式,如逗号、、、)
item(名字自定义):表示本次遍历获取的元素,遍历List、Set、Array时表示每项元素,遍历Map时表示键值对的值
index:遍历List、Array时表示遍历的索引,遍历Map时表示键值对的键-->
<delete id="deleteBatch" parameterType="int">
delete from user
<where>
<foreach collection="array" open="id IN(" close= ")" separator="," item="id">
#{id}
</foreach>
</where>
</delete>
2.<foreach>标签迭代List
<foreach> 遍历List和Set的方法是一样的,这里使用 <foreach> 遍历List集合进
行批量添加,collection传入list即可!
// 5.批量插入数据,测试动态SQL的<foreach>标签,遍历Collection
// 系统插入语句:insert into user(username,sex,address) values(),(),()
// 批量新增方法,测试<foreach>标签,遍历Collection集合
void insertBatch(List<User> user);
<!--5.批量插入数据,测试动态SQL的<foreach>标签,遍历Collection-->
<!--Collection:遍历的对象类型 item:遍历获取的元素(名字自定义,可以调用字段名进行传参) separator:分隔符-->
<insert id="insertBatch" parameterType="User">
insert into user(username,sex,address) values
<foreach collection="list" item="user" separator=",">
(#{user.username},#{user.sex},#{user.adddress})
</foreach>
</insert>
3.<foreach>标签迭代Map
注意:1.collection:传入的不是遍历的对象类型map,List、Set、Array传入的类型分别是list、set、array,但Map集合传入的不是map,而是持久层接口中定义的参数名 如:@Param("queryMap")
// 6.多条件查询:批量查询方法,测试<foreach>标签,遍历Map集合
/**
* 多条件查询:批量查询方法,测试<foreach>标签,遍历Map集合
* @param map 查询的条件键值对 键:属性名 值:出入要查询的属性名
* 系统的查询语句:select * from user where username = ? and sex = ?
* @return
* @Param:为参数起别名
*/
List<User> findUser(@Param("queryMap") Map<String,Object> map);
<!--6.多条件查询:批量查询方法,测试<foreach>标签,遍历Map集合-->
<!--注意:1.collection:传入的不是遍历的对象类型,List、Set、Array传入的类型分别是list、set、array,
但Map集合传入的不是map,而是持久层接口中定义的参数名 如:@Param("queryMap")
2.separator:传入的是and不是逗号,因为查询给定的条件是and连接,修改是逗号连接
3.index:Map类型的键,起名为key item:Map类型的值,起名为value
4.特别注意:sql语句key=value(键=值),键只能用${},作为字符串拼接到sql语句中,因为键是属性名
值可以用#{},作为占位符-->
<select id="findUser" parameterType="map" resultType="User">
select * from user
<where>
<foreach collection="queryMap" separator="and" index="key" item="value">
${key} = #{value}
</foreach>
</where>
</select>