Mybatis update <forech> 报错,单条成功多条失败

业务背景

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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值