MyBatis `<foreach>`

概念:

在MyBatis的<foreach>元素中,collectionitemopencloseseparatorindex这些属性都有特定的含义,它们一起定义了如何迭代集合并为SQL语句生成相应的片段。下面是对这些属性的详细解释:

  1. collection:

    • 意义: 指定要遍历的集合或数组的名称。

    • 用途: 告诉MyBatis从哪个集合或数组中获取元素来构建SQL。

    • 示例: 如果你的参数是一个Map,并且你想遍历这个Map的键,那么你可以这样写:collection="map.keys"

      如果参数是一个List,那么你可以直接写:collection="list"

  2. item:

    • 意义: 指定每次迭代时的当前元素的变量名。

    • 用途: 在<foreach>标签内部,你可以使用这个变量来引用当前迭代到的元素。

    • 示例: 如果你的集合包含字符串,你可以写:item="str",然后在<foreach>内部使用${str}来引用当前字符串。

  3. open和close:

    • 意义: 这两个属性分别指定了生成的SQL片段的开始和结束字符串。

    • 用途: 当你想要包裹整个遍历生成的SQL片段时,这两个属性非常有用。

    • 示例: 对于一个IN子句,你可能会这样写:open="("close=")",这会生成一个被括号包裹的列表。

  4. separator:

    • 意义: 指定迭代过程中生成的每个元素之间的分隔符。

    • 用途: 当你想要把多个元素连接起来时,比如在IN子句中,你需要用逗号分隔不同的值。

    • 示例: 对于IN子句,你可以写:separator=",",这样每个值之间都会用逗号分隔。

  5. index:

    • 意义: 当遍历集合时,指定用于引用当前元素索引的变量名。

    • 用途: 对于某些集合,比如List或数组,你可能想要引用元素的索引(位置)。

    • 示例: 如果你正在遍历一个List,并且想要同时获取元素的值和它的索引,你可以写:index="idx"item="value",然后在<foreach>内部使用${idx}#{value}

这些属性通常一起使用,以便能够灵活地构建各种SQL语句片段。通过组合这些属性,你可以创建复杂的SQL语句,这些语句在运行时可以动态地根据输入数据变化。

理解

foreach `循环标志

collection、 拿到的集合。List 或 Map

index 集合中的每一个对象 的 下标 或 键

item、 集合中的每一个对象 的 值

open、 循环开始前

close、 循环结束后

separator 每层循环的分隔符

<foreach collection="list" item="user" separator=",">  
        (#{user.id}, #{user.name}, #{user.age})  
</foreach>  
​
<foreach collection="map.keys" item="key" separator=",">  
    ${key} = #{map[key]}  
</foreach>
​
<foreach collection="map" item="value" index="key" open="(" close=")"  separator=",">  
    ${key} = #{value}  
</foreach>

例子

下面我将给出几个使用MyBatis <foreach> 元素属性的具体例子,这些例子展示了如何根据提供的集合或数组动态构建SQL语句。

例子 1: 遍历集合插入多条记录

假设我们有一个用户列表,并且想要一次性插入这些用户到数据库中。

Mapper XML:

<insert id="insertUsers" parameterType="list">  
    INSERT INTO users (id, name, age)  
    VALUES  
    <foreach collection="list" item="user" separator=",">  
        (#{user.id}, #{user.name}, #{user.age})  
    </foreach>  
</insert>

在这个例子中,collection="list" 指定了我们要遍历的集合,item="user" 是每次迭代时当前元素的变量名。separator="," 表示每个插入的元组之间用逗号分隔。

例子 2: 使用IN子句查询数据

如果我们想要根据ID列表查询用户,我们可以使用IN子句。

Mapper XML:

<select id="selectUsersByIds" parameterType="list" resultType="User">  
    SELECT * FROM users  
    WHERE id IN  
    <foreach collection="list" item="id" open="(" close=")" separator=",">  
        #{id}  
    </foreach>  
</select>

在这个例子中,open="("close=")" 分别指定了IN子句的开始和结束括号。separator="," 表示每个ID之间用逗号分隔。

例子 3: 使用索引和值遍历Map

假设我们有一个Map,其中键是列名,值是对应的值,我们想要根据这个Map动态构建UPDATE语句。

Mapper XML:

<update id="updateUser" parameterType="map">  
    UPDATE users  
    <foreach collection="map" item="value" index="key" separator=",">  
        ${key} = #{value}  
    </foreach>  
    WHERE id = #{id}  
</update>

在这个例子中,collection="map" 指定了我们要遍历的Map,item="value" 是每次迭代时当前值的变量名,index="key" 是每次迭代时当前键的变量名。separator="," 表示每个字段的更新语句之间用逗号分隔。

例子 4: 遍历数组插入数据

如果我们有一个ID数组,并想要根据这些ID插入到另一个表中,可以这样做:

Mapper XML:

<insert id="insertRelatedIds" parameterType="int[]">  
    INSERT INTO related_ids (user_id)  
    VALUES  
    <foreach collection="array" item="id" separator=",">  
        (#{id})  
    </foreach>  
</insert>

在这个例子中,collection="array" 指定了我们要遍历的是数组。其他属性和之前例子中的用法相同。

这些例子展示了如何灵活地使用MyBatis的<foreach>元素来构建动态SQL语句。你可以根据实际需求调整collectionitemopencloseseparatorindex等属性的值。

例子 5: 批量插入数据

Integer insertBathData(@Param("tableName")String tableName,@Param("paramMap")Map<String,Object> paramMap,@Param("dataList")List<Map<String,Object>>dataList);
INSERT INTO ${tableName}
<foreach collection="paramMap.keys" item="key" open="(" close=")" separator="," >
    ${key}
</foreach>  //遍历map的键
values
<foreach collection="dataList" item="map"   separator=",">//遍历list<Map<>>
    <foreach collection="map"  item="value" open="(" close=")" separator=",">//遍历每个值
        #{value}
    </foreach>
</foreach>

效果:

INSERT INTO some_table (name, age)

VALUES (value1_for_name, value1_for_age), (value2_for_name, value2_for_age)

相关推荐

  1. MyBatis `<foreach>`

    2024-04-23 15:04:04       16 阅读
  2. Mybatis 动态 SQL - foreach

    2024-04-23 15:04:04       40 阅读
  3. MyBatis 的 `<foreach>` 标签

    2024-04-23 15:04:04       14 阅读
  4. mybatisforeach使用

    2024-04-23 15:04:04       17 阅读
  5. 详细分析Mybatis中的<foreach>标签

    2024-04-23 15:04:04       37 阅读
  6. MyBatisforeach>标签的用法

    2024-04-23 15:04:04       14 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-23 15:04:04       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-23 15:04:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-23 15:04:04       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-23 15:04:04       20 阅读

热门阅读

  1. Rust 语言中的跨平台 GUI 库

    2024-04-23 15:04:04       11 阅读
  2. docker快速使用简介

    2024-04-23 15:04:04       12 阅读
  3. docker 安装 jenkins

    2024-04-23 15:04:04       13 阅读
  4. C# 调整图像的亮度简单示例

    2024-04-23 15:04:04       12 阅读
  5. HX519 是一款防倒流数据线芯片

    2024-04-23 15:04:04       13 阅读
  6. Python机器学习库中Scikit-learn和TensorFlow如何选择?

    2024-04-23 15:04:04       12 阅读
  7. 数据结构:哈密顿回路基础

    2024-04-23 15:04:04       14 阅读
  8. 用户权限—— u+s\g+s\o+t三个特殊权限说明

    2024-04-23 15:04:04       13 阅读