备注
针对某些时候业务上可能需要批量更新数据表中的数据。
实现
在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语句时使用事务进行控制。