Mybatis批量更新出现BadSqlGrammarException错误

进行批量更新操作,xml文件如下:

 <update id="batchUpdateByPrimaryKeySelective" parameterType="java.util.List">
    <foreach collection="list" item="record" separator=";">
      update qs_capital_platform_actual_repayment
      <if test="record.rechargeRecordId != null">
        recharge_record_id = #{record.rechargeRecordId,jdbcType=BIGINT},
      </if>
      <if test="record.allocatePlanId != null">
        allocate_plan_id = #{record.allocatePlanId,jdbcType=BIGINT},
      </if>
。。。()
      where id = #{record.id,jdbcType=BIGINT}
    </foreach>
  </update>

使用这中foreach的批量操作,可以看做是好多的sql,update …;每个更新一条的sql用分号分开,然后一次拿去数据库执行,这样更新多条,其实就是一次性执行了多条sql。但是使用mysql数据库,如果没有设置数据库的配置&allowMultiQueries=true

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?userUnicode=true&allowMultiQueries=true

就会报那个错,他默认不允许一次执行多条sql。如果有时候我们没法修改数据库配置。可是使用case when的方式来批量操作。

 <update id="batchUpdate" parameterType="list">
        UPDATE students
        <trim prefix="set" suffixOverrides=",">
            <trim prefix="classno=case" suffix="end,">
                <foreach collection="list" item="item" index="index">
                    WHEN sno=#{item.sno} THEN #{item.classno}
                </foreach>
            </trim>
        </trim>
        WHERE sno IN
        <foreach collection="list" separator="," item="item" index="index" open="(" close=")">
           #{item.sno}
        </foreach>
    </update>

prefix=“classno=case” ,classno是一个表字段,这段的意思就是根据id,更新字段classno的值,如果需要更新多个字段,下面这一段,多加几个就行了。把classno替换掉

<trim prefix="classno=case" suffix="end,">
                <foreach collection="list" item="item" index="index">
                    WHEN sno=#{item.sno} THEN #{item.classno}
                </foreach>
            </trim>

这样拼装出来的sql就是下面这样

 UPDATE students set classno=case WHEN sno=? THEN ? WHEN sno=? THEN ? WHEN sno=? THEN ? WHEN sno=? THEN ? WHEN sno=? THEN ? WHEN sno=? THEN ? end WHERE sno IN ( ? , ? , ? , ? , ? , ? ) 

这样就是只有一条sql,就不会有错了。

你可能感兴趣的:(学习笔记,问题解析)