解决mybatis批量更新(updateforeach)失败的问题
如下所⽰:
<!--批量更新报表 -->
<update id="updateIssueByBatch" parameterType="java.util.List">
<foreach collection="issueList" item="item" index="index" separator=";">
update sys_issue
<set>
<if test="item.first != null and item.first != ''">first_class = #{item.first}, </if>
<if test="item.second != null and item.second != ''">second_class = #{item.second}, </if>
updated_time = now()
</set>
where id = #{item.Id}
</foreach>
</update>
报错如下:
The error occurred while setting parameters
问题描述:
上⽹查询说是配置mysql的时候没有开启批量插⼊,就查询了项⽬是否配置了 allowMultiQueries=true ,发现本地和线上都配置了该语句,问题没出在这。那么问题出在哪呢?后来发现是由于线上将& 变成了 & 造成的。
* 前后对⽐如下:*
修改前:
jdbc.url=jdbc:mysql://XXX/abc?useUnicode=true&zeroDateTimeBehavior=convertToNull&allowMultiQu
eries=true
修改后:
jdbc.url=jdbc:mysql://XXX/abc?useUnicode=true&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true
补充知识:Mybatis 批量更新失败,单条成功
在项⽬开发过程中,结合业务场景,需要对某个表进⾏批量更新,完成所有的业务代码和Mybatis XML⽂件后,单元测试时,发现调⽤批量更新只有⼀条记录时,执⾏成功,传⼊多条记录,进⾏批量更新时,则提⽰失败,错误信息如下:
org.springframework.jdbc.BadSqlGrammarException:
### Error updating database. Cause: ptions.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 '...... ### The error may involve ....
### The error occurred while setting parameters ### SQL:
其中XML映射批量更新的结构如下:
<!-- 批量更新 -->
<update id="batchUpdate" parameterType="java.util.List">
<foreach collection="list" item="item" separator=";">
update xxxxxx
<set>
<if test="!= null">
xxx= #{,jdbcType=BIGINT},
</if>
安装mysql失败......
</set>
where id =#{item.id}
</foreach>
</update>
经过代码排查,以及批量update语句通过SQL⼯具直接执⾏均能成功,排除代码和sql语句问题,最后求助Google⼤神,发现使⽤mybatis进⾏批量插⼊与更新时,必须在配置连接url时指定allowMultiQueries=true
mysql.db.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&&allowMultiQueries=true
经测试,完美解决此问题。
以上这篇解决mybatis批量更新(update foreach)失败的问题就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。