mybatis批量更新-Mysql

备注

针对某些时候业务上可能需要批量更新数据表中的数据。

实现

在sql语句中拼接分号’;',实现多条SQL一次执行

前提

数据库连接URL后面需要携带allowMultiQueries=true参数,形如‘jdbc://xxxx:3306?allowMultiQueries=true’

具体列子

1.mybatis配置文件

<update id="batchUpdate">
        <foreach collection="list" item="item" open="" close="" separator=";">
            update table_name
            <set>
                <if test="item.itemValue!=null and item.itemValue!=''">
                    item_value=#{item.itemValue},
                </if>
            </set>
            where id=#{item.id}
        </foreach>
    </update>

2.mapper文件

int batchUpdate(@Param("list") List<ItemRecordDO> list);

3.调用

List<ItemRecordDO> list = ......;
XXXMapper.batchUpdate(list);

⚠️ 注意

1.如果没有设置allowMultiQueries=true参数,批量更新会抛错

....
### SQL: update  table_name item_value=? where id = ?          ;              update  table_name item_value=? where id = ?
### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '='Exkehgiekalxie' where id = 10193
         ; 
            update  table_name item_value='Exkehgiekalxie' at line 1
; bad SQL grammar []; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ='Exkehgiekalxie' where id = 10193
         ; 
....

2.出于安全和性能的考虑,通常不建议在生产环境中启用它。原因如下

  • 安全性问题:允许一次性执行多个SQL查询可能会带来安全隐患,因为恶意用户可以利用这个功能执行恶意的SQL语句。因此,在动态拼接SQL语句时,一定要注意防止SQL注入攻击。
  • 性能问题:一次性执行多个SQL查询可能会影响数据库的性能,尤其是在大数据量的情况下。因此,应该谨慎使用allowMultiQueries参数,避免频繁执行大量SQL语句。
  • 事务处理:当开启allowMultiQueries参数时,需要特别注意事务处理。如果其中一个SQL语句执行失败,可能会导致整个操作的回滚问题。因此,建议在执行多个SQL语句时使用事务进行控制。
  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis中实现批量更新MySQL有几种方式,包括使用case when、foreach成多条SQL、ON DUPLICATE KEY UPDATE和replace into。下面是这几种方式的介绍: 1. 使用case when: ```xml <update id="batchUpdate" parameterType="java.util.List"> UPDATE table_name SET column_name = CASE <foreach collection="list" item="item" separator=" "> WHEN id = #{item.id} THEN #{item.value} </foreach> END WHERE id IN <foreach collection="list" item="item" open="(" separator="," close=")"> #{item.id} </foreach> </update> ``` 2. foreach成多条SQL: ```xml <update id="batchUpdate" parameterType="java.util.List"> <foreach collection="list" item="item" separator=";"> UPDATE table_name SET column_name = #{item.value} WHERE id = #{item.id} </foreach> </update> ``` 3. ON DUPLICATE KEY UPDATE(仅适用于MySQL): ```xml <update id="batchUpdate" parameterType="java.util.List"> INSERT INTO table_name (id, column_name) VALUES <foreach collection="list" item="item" separator=","> (#{item.id}, #{item.value}) </foreach> ON DUPLICATE KEY UPDATE column_name = VALUES(column_name) </update> ``` 4. replace into(仅适用于MySQL): ```xml <update id="batchUpdate" parameterType="java.util.List"> REPLACE INTO table_name (id, column_name) VALUES <foreach collection="list" item="item" separator=","> (#{item.id}, #{item.value}) </foreach> </update> ``` 这些是在MyBatis中实现批量更新MySQL的几种方式。根据具体的需求和数据库类型,选择适合的方式进行批量更新操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值