使用Mybatis批量更新的一个小问题

批量更新的方式有很多种,例如update case when,foreach update等,今天在使用其中一种foreach update时一直报SQL语法错误,看了半天没看出哪里有问题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<update id="updateBatch" parameterType="list">
<foreach collection="list" item="item" separator=";" index="index">
update test
<set>
status = #{item.status,jdbcType=BIGINT},
amount = #{item.amount,jdbcType=BIGINT},
version = version+1,
gmt_modified = now(),
</set>
<where>
id = #{item.id}
</where>
</foreach>
</update>

非常简单的update SQL,通过Mybatis foreach 生成多个update SQL同时执行,但是运行时一直报:

1
2
3
4
5
6
### 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 'update test
SET amount = -116534270,
version' at line 10
; 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 'update test
SET amount = -116534270,
version' at line 10

看到这个错误下意识的认为肯定是sql哪里写的不对有语法错误,可是检查了半天没发现问题,而且将报错的sql 通过navicat运行也可以通过。

后来查到如果批量执行语句需要将database connection url中加上如下参数:

1
allowMultiQueries=true

完整的url例如:

1
jdbc:mysql://x.x.x.x:3306/xxxx?allowMultiQueries=true&amp;autoReconnect=true&amp;useUnicode=true&amp;characterset=utf8mb4

不得不说MySQL报错信息实在是太模糊了。😓

使用Mybatis批量更新的一个小问题

https://jingzhouzhao.github.io/archives/e8013d2a.html

作者

太阳当空赵先生

发布于

2021-03-25

更新于

2022-02-22

许可协议

评论