mybatis3.4.6 批量更新 foreach 遍历map 的正确姿势

好久没编码了!最近开始编码遇到一个问题 !一个批量修改的问题,就是mybatis foreach 的使用。

当时使用的场景 ,前端 传逗号拼接的字符串id,  修改id对应数据的数据顺序 ,顺序 就是id 的顺序.

就是一个条件(单个id值) 修改一个值(传入的id的顺序) ,

1、 把条件作为Map 的key  修改值是value,用map入参

2、用List<Object> 或者数组 ,把条件和值封装成对象放进list集合或者array数组

3、代码使用for循环调用mapper方法 穿两个参数。

因为考虑到第二种用法,需要不断创建对象 放进数组在 遍历数组获取对象取值。从虚拟机的堆内存考虑,放弃------------------------

第三种方法,会循环多少次就执行多少条sql语句,放弃-----------------------

于是使用Map,

可是在mybatis中参数是map的foreach使用,对于很久没编码的我,实在是忘记得很干净。于是百度一堆,一致性 就是报错:

### 使用 MyBatis `foreach` 标签遍历 MapMyBatis 中,`<foreach>`标签用于循环处理集合类型的参数。当需要遍历 `Map` 类型的数据结构时,可以通过指定 `collection` 属性来访问 `Map` 中的具体键值对。 #### 示例:通过 `<foreach>` 遍历 Map 查询数据库记录 假设有一个场景,前端传来一组用户的用户名和年龄作为查询条件,这些信息被封装在一个名为 `conditionMap` 的 `HashMap<String, Object>` 对象里: ```xml <select id="findUsersByConditions" parameterType="java.util.Map" resultType="User"> SELECT * FROM users u WHERE (u.username, u.age) IN <foreach collection="userList" item="entry" open="(" separator="), (" close=")"> (#{entry.key}, #{entry.value}) </foreach> </select> ``` 上述 SQL 片段中,`collection="userList"` 表明要迭代的是传入的 `Map` 参数里的 `userList` 键所指向的对象;`item="entry"` 定义每次迭代得到的项称为 entry,在这里是 `Map.Entry<String, String>` 形式的条目[^1]。 为了更好地理解这个过程,下面给出 Java 侧准备并调用此接口的例子: ```java // 准备数据 List<User> userList = Arrays.asList( new User("Alice", "20"), new User("Bob", "25") ); // 将列表转换为适合传递给 Mapper 方法的形式 Map<String, Object> params = new HashMap<>(); params.put("userList", userList.stream() .filter(user -> user.getUsername() != null && !"".equals(user.getUsername())) .collect(Collectors.toMap(User::getUsername, User::getAge)) ); ``` 这段代码创建了一个包含多个用户的信息映射表,并将其放入到待发送至 MyBatis 映射文件的方法参数之中[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值