SQL语句中有时会使用IN关键字,例如id in (1,2,3)。
有两种方式来实现
1.${ids} - 缺点是不能防止SQL注入
2.foreach + #{id}
foreach 可以对数组、Map 或实现了 Iterable 接口(如 List、Set)的对象进行遍历。数组在处理时会转换为 List 对象进行处理,因此 foreach 遍历的对象可以分为两大类:Iterable 类型和 Map 类型。这两种类型在遍历循环时情况不一样。
// 入参代码
List listUserByIds(List idList);
-- xml代码 -->
private Object wrapCollection(final Object object) {
if (object instanceof Collection) {
// 当参数为Collection时,默认转为map,并添加一个 key 为 collection 的值
StrictMap
// 如果使用数组类型,则应该这么编写代码
// 接口
List listUserByIds(Long[] idArray);
// xml
<foreach collection="array" open="(" close=")" separator="," item="id" index="i">
#{id}
foreach>
// 自定义collection名
// 接口指定collection名
List listUserByIds(@Param(value = "idArray") Long[] idArray);
// xml
<foreach collection="idArray" open="(" close=")" separator="," item="id" index="i">
#{id}
foreach>
使用 Map 和使用@Param注解方式类似,将 collection 指定为对应 Map 中的 key 即可。如果要循环所传入的 Map,推荐使用@Param注解指定名字,此时可将 collection 设置为指定的名字,如果不想指定名字,就要使用默认值_parameter。
对象参数,通过点属性可以获取。
多层对象继续加点属性。
集合和数组可以使用下标取值
// 接口方法 - 返回该sql执行后影响的行数
int insertUserList(List userList);
// xml
"insertUserList">
insert into user(
user_name, user_password,user_email,
user_info, head_img, create_time)
values
<foreach collection="list" item="user" separator=",">
(
#{user.userName}, #{user.userPassword},#{user.userEmail},
#{user.userInfo}, #{user.headImg, jdbcType=BLOB}, #{user.createTime, jdbcType=TIMESTAMP}
)
foreach>
// 返回插入后的主键ID
"insertUserList" useGeneratedKeys="true" keyProperty="id">
这样就会把Mysql自动生成的主键set到名为id的属性值上面。
可以通过如下方式获取主键值。
// Java
for(User user : userList){
System.out.println(user.getId());
}
// 参数类型是Map,实现动态更新
// 原理是当参数是 Map 类型的时候,foreach 标签的 index 属性值对应的不是索引值,而是 Map 中的 key,利用这个 key 可以实现动态 UPDATE。
// xml代码如下
"updateByMap">
update user
set
<foreach collection="_parameter" item="val" index="key" separator=",">
${key} = #{val}
foreach>
where id = #{id}
// 处理业务时进行foreach需要做非空判断或者长度不为0判断
// list.size() > 0。
// map.size() > 0。
// object != null