(●‘◡‘●) MyBatis 知识点

概念:

在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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值