解决mybatis批量更新(update foreach)失败的问题
如下所示:
updatesys_issue whereid=#{item.Id} first_class=#{item.first}, second_class=#{item.second}, updated_time=now()
报错如下:
Theerroroccurredwhilesettingparameters
问题描述:
上网查询说是配置mysql的时候没有开启批量插入,就查询了项目是否配置了allowMultiQueries=true,发现本地和线上都配置了该语句,问题没出在这。那么问题出在哪呢?后来发现是由于线上将&变成了&造成的。
*前后对比如下:*
修改前:
jdbc.url=jdbc:mysql://XXX/abc?useUnicode=true&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true
修改后:
jdbc.url=jdbc:mysql://XXX/abc?useUnicode=true&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true
补充知识:Mybatis批量更新失败,单条成功
在项目开发过程中,结合业务场景,需要对某个表进行批量更新,完成所有的业务代码和MybatisXML文件后,单元测试时,发现调用批量更新只有一条记录时,执行成功,传入多条记录,进行批量更新时,则提示失败,错误信息如下:
org.springframework.jdbc.BadSqlGrammarException: ###Errorupdatingdatabase.Cause:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:YouhaveanerrorinyourSQLsyntax;checkthemanualthatcorrespondstoyourMySQLserverversionfortherightsyntaxtousenear'...... ###Theerrormayinvolve.... ###Theerroroccurredwhilesettingparameters###SQL:
其中XML映射批量更新的结构如下:
updatexxxxxx whereid=#{item.id} xxx=#{item.xxx,jdbcType=BIGINT}, ......
经过代码排查,以及批量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批量更新(updateforeach)失败的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。