mybatis使用map批量更新(Oracle)

持久层接口的的方法:

void batchUpdateLogistics(@Param("callMap") Map<String, String> callMap);

映射文件以下三种写法均可以,注意";"的使用:

<update id="batchUpdateLogistics" parameterType="map">
    <foreach collection="callMap.entrySet()" item="value" index="key"
            open="begin" close=";end;" separator=";">
        update TD_LOGISTICS t set t.record=#{value} where t.sessionId=#{key}
    </foreach>
</update>

<update id="batchUpdateLogistics" parameterType="map">
    <foreach collection="callMap.entrySet()" item="value" index="key"
            open="begin" close="end;" separator="">
        update TD_LOGISTICS t set t.record=#{value} where t.sessionId=#{key};
    </foreach>
</update>

<update id="batchUpdateLogistics" parameterType="map">
    begin
    <foreach collection="callMap.entrySet()" item="value" index="key" separator="">
        update 
### MyBatis 使用 Oracle 批量更新的操作方法及示例代码 在 MyBatis 中实现 Oracle批量更新操作时,可以利用 `<foreach>` 标签生成动态 SQL。以下是一个完整的实现方式: #### 1. 使用 `<foreach>` 动态生成批量更新语句 通过 `<foreach>` 标签遍历传入的参数列表,并为每个元素生成一条 `UPDATE` 语句。以下是一个具体的示例[^3]: ```xml <update id="batchUpdate" parameterType="java.util.List"> <foreach collection="list" item="item" index="index" separator=";" open="BEGIN" close="END;"> UPDATE fk_tpledgepool SET <if test="item.poolName != null and item.poolName != ''"> pool_name = NVL(#{item.poolName,jdbcType=VARCHAR}, ' '), </if> <if test="item.beginDate != null and item.beginDate > 0"> begin_date = NVL(#{item.beginDate,jdbcType=INTEGER}, 0), </if> <if test="item.endDate != null and item.endDate > 0"> end_date = NVL(#{item.endDate,jdbcType=INTEGER}, 0), </if> last_updated = SYSDATE WHERE company_id = #{item.companyId} AND pool_id = #{item.poolId} AND pool_type = #{item.poolType} </foreach> </update> ``` 上述代码中: - `fk_tpledgepool` 是目标表。 - `<foreach>` 遍历传入的参数列表 `list`,并为每个元素生成一条 `UPDATE` 语句。 - 使用 `<if>` 标签判断字段是否需要更新,避免不必要的 `NULL` 值覆盖。 - `NVL` 函数确保即使传入 `NULL` 值也能正确处理。 - `last_updated = SYSDATE` 自动更新记录的最后修改时间。 #### 2. 处理 NULL 值问题 在使用 `UPDATE` 语句时,如果某些字段可能为 `NULL`,需要特别注意。可以通过显式检查 `NULL` 值来避免问题[^3]: ```xml <if test="item.fieldName != null"> field_name = NVL(#{item.fieldName,jdbcType=VARCHAR}, 'DEFAULT_VALUE'), </if> ``` 上述代码中: - 使用了 `NVL` 函数确保即使传入 `NULL` 值也能正确处理。 - 设置了默认值 `'DEFAULT_VALUE'`,以防止字段被意外清空。 #### 3. 参数类型 在 MyBatis 中,`parameterType` 可以指定为 `java.util.List` 或其他集合类型。例如,如果传入的是一个 `ArrayList`,则可以在 Java 代码中这样调用: ```java List<Map<String, Object>> dataList = new ArrayList<>(); Map<String, Object> record1 = new HashMap<>(); record1.put("companyId", 1); record1.put("poolId", 101); record1.put("poolType", "A"); record1.put("poolName", "Updated Pool Name"); dataList.add(record1); Map<String, Object> record2 = new HashMap<>(); record2.put("companyId", 2); record2.put("poolId", 102); record2.put("poolType", "B"); record2.put("beginDate", 20230101); dataList.add(record2); mapper.batchUpdate(dataList); ``` #### 4. 注意事项 - 确保数据库用户具有执行 `UPDATE` 操作的权限。 - 如果数据量较大,建议分批提交以避免内存溢出或锁表问题。 - 在生产环境中,应避免直接打印 SQL 语句,以免暴露敏感信息。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值