Mybaits | Mysql编程 - foreach详细解析

Mybaits | Mysql编程 - foreach详细解析


1.foreach在in()中的应用

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代码 -->

2.mybaits处理foreach - collection的源码解析

private Object wrapCollection(final Object object) {
    if (object instanceof Collection) {
        // 当参数为Collection时,默认转为map,并添加一个 key 为 collection 的值
        StrictMap map = new StrictMap();
        map.put("collection", object);
        // 如果参数是list类型,就添加一个 key 为 list的值
        if (object instanceof List) {
            map.put("list", object);
        }
        return map;
    } else if (object != null && object.getClass().isArray()) {
        // 如果参数是array,也默认转为map
        StrictMap map = new StrictMap();
        map.put("array", object);
        return map;
    }
    return object;
} 
  

3.collection

// 如果使用数组类型,则应该这么编写代码

// 接口
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>

4.Map参数

使用 Map 和使用@Param注解方式类似,将 collection 指定为对应 Map 中的 key 即可。如果要循环所传入的 Map,推荐使用@Param注解指定名字,此时可将 collection 设置为指定的名字,如果不想指定名字,就要使用默认值_parameter。

5.Object参数

对象参数,通过点属性可以获取。
多层对象继续加点属性。
集合和数组可以使用下标取值

6.foreach批量插入

// 接口方法 - 返回该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());
}

7.foreach在动态更新上的应用

// 参数类型是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}

8.注意点

// 处理业务时进行foreach需要做非空判断或者长度不为0判断
// list.size() > 0。
// map.size() > 0。
// object != null

你可能感兴趣的:(#,Mybaits框架)