业务背景
springboot + mysql : 前端导入多条数据,根据一些条件判断,组装需要插入的数据存入集合中进行批量插入,同样如果已经存在则批量更新.
2.mapper.xml
<update id="batchUpdate" parameterType="java.util.List" >
<foreach collection="list" item="item" index="index" open="" close="" separator=";">
update test_user
<set >
<if test="item.name != null" >
name = #{item.name,jdbcType=VARCHAR},
</if>
<if test="item.age != null" >
age = #{item.age,jdbcType=INTEGER}
</if>
</set>
where id = #{item.id,jdbcType=BIGINT}
</foreach>
3.控制台报错信息
单条数据更新是ok的,但是多条数据update一直报sql语法错误,一开始还真有点懵逼…一万匹小马在奔跑
### The error occurred while setting parameters
### SQL: UPDATE test_user SET name = ?, age = ? WHERE 1=1 AND id = ? ; UPDATE test_user SET name = ?, age = ? WHERE 1=1 AND id = ?
### Cause: java.sql.SQLSyntaxErrorException: 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_user
SET
name = 2,
ag' at line 26
4.原因及解决方案
原因:
由于我们是批量 更新,其实底层也是多条update语句通过分号隔开的sql语句集(从第3点的控制台报错信息可以看出来多条update sql语句是 ; 来隔开了的)
解决档案:
修改application.yml 数据源配置 spring.datasource.url 配置项添加:allowMultiQueries=true
allowMultiQueries的作用: 从字面意思来看就是-允许批量查询
1.可以在sql语句后携带分号,实现多语句执行。
2.可以执行批处理,同时发出多个SQL语句。
spring:
profiles: test
application:
name: test-project
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://localhost/test-db?rewriteBatchedStatements=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true
username: admin
password: admin