MyBatis的foreach语句

本文深入探讨了Mybatis中使用集合进行动态SQL构造的技术,包括foreach元素的参数详解,实现多条记录的保存与查询方法。通过具体代码示例展示了如何利用Mybatis的动态SQL特性灵活处理数据库操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Mybatis的xml配置中使用集合,主要是用到了foreach动态语句。

foreach的参数:
foreach元素的属性主要有 item,index,collection,open,separator,close。
item表示集合中每一个元素进行迭代时的别名.
index指定一个名字,用于表示在迭代过程中,每次迭代到的位置.
open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔符.
close表示以什么结束。


1. Mybatis生成select * from table where id in(1,2,...,n)语句的查询

我们一般的做法是在方法的参数处指定传入的参数名称,在xml中使用的时候,集合的名称要和方法的Param的名称一致,这样便于阅读和理解,然后是在对应的xml文件中使用foreach循环。

java代码如下:


public abstract List findByIds(@Param("ids")List ids);

对应的xml代码如下:


select * from table

    id in #{item}

2.Mybatis保存多条记录

我们同样是通过foreach的方法来实现,这里我们巧妙的利用了sql的语法规则用Mybatis的foreach动态语句来处理。

java代码:


public abstract void saves(@Param("tables")List tables);

xml代码:


insert into table(name,addtime) values
  
    (#{item.name},#{item.addtime})

以上方法Mybatis会帮我们进行sql注入拦截,Mybatis如果采用#{xxx}的形式设置参数,Mybatis会进行sql注入的过滤。如果采用的是${xxx},Mybatis不会进行sql注入过滤,而是直接将参入的内容输出为sql语句。

 

3、数据

     // 存储条件
        Map params = new HashMap();
        // 选中学生证件号码
        String[] zjhmArray = zjhmList.replace(" ", "").split(",");
        // 证件号码
        params.put("zjhmArray", zjhmArray);

4、sql语句

  <<delete id="delTPsinfoRevPrivate">>

 DELETE T_PSINFO_REV_PRIVATE a
         WHERE a.DELFLG = '0'
           AND a.ZJHM IN
      <<if test="zjhmArray != null and zjhmArray.length != 0">>
           <<foreach collection="zjhmArray" index="index" item="item" open="(" close=")" separator=",">>

                #{item}
            <</foreach>>

      <</if>>

 <</delete>>

### 使用 MyBatis `foreach` 进行批量更新 在处理需要对多个记录执行相同类型的更新操作时,MyBatis 提供了 `foreach` 标签来简化这一过程。通过这种方式可以在一次数据库交互中完成多条记录的更新。 对于批量更新的操作,在 SQL 映射文件中的定义方式如下: ```xml <update id="batchUpdateUsers" parameterType="java.util.List"> UPDATE t_user <set> username = CASE id <foreach collection="list" item="user" index="index" separator=""> WHEN #{user.id} THEN #{user.username} </foreach> END, email = CASE id <foreach collection="list" item="user" index="index" separator=""> WHEN #{user.id} THEN #{user.email} </foreach> END </set> WHERE id IN <foreach collection="list" item="user" open="(" separator="," close=")"> #{user.id} </foreach> </update> ``` 上述代码展示了如何构建一个能够接收用户列表并针对每个用户的 ID 更新其用户名和邮箱地址的批处理语句[^1]。 当传递给此方法的是一个对象列表时,可以通过指定 `parameterType` 属性为相应的 Java 类型(如 `java.util.List`),并通过 `collection` 属性指明要迭代的数据源名称(在此处即为 `"list"`)。同时,为了区分不同的字段值,使用了 `CASE...WHEN...THEN...END` 结构来进行条件赋值[^2]。 此外,如果参数是以 Map 形式传入,则需调整 `collection` 值指向 map 中对应的键名;而如果是基本类型数组或者 List 则可以直接设置为 `"array"` 或者 `"list"`[^3]。 #### 注意事项 - 批量更新应谨慎对待事务管理,确保所有更改要么全部成功提交,要么回滚以保持数据一致性。 - 对于大规模数据集建议分批次处理以免占用过多内存资源影响性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值