Mysql批量更新的一个坑-&allowMultiQueries=true允许批量更新

摘要:
首先,让我们看看SQL配置updatet_xxx<set>old_ Id=#{item.oldId}˂/set>其中Id=#{item.Id}˂/foreach>˂/update。解决方案后来发现,我们必须主动设置MySQL的批更新,即设置数据库的连接url,并添加*&allowMultiQueries=true*。最初,参数&allowMultiQueries=true必须使用mybasic添加到批处理操作中。此参数表示允许多个查询。通过这种方式,您可以随意使用mybatis的批量操作!

前言
        实际上,我们经常会遇到这样的需求,那就是利用Mybatis批量更新或者批量插入,但是,实际上即使Mybatis完美支持你的sql,你也得看看你说操作的数据库是否支持,而阿福,最近就遇到这样的一个坑。

问题
        先带大家来看一段sql的配置,

<update id="updateAllAvailable">
<foreach collection="skuOptionList" item="item" index="index" open="" close="" separator=";">
update t_xxx
<set>
old_id = #{item.oldId}
</set>
where id = #{item.id}
</foreach>
</update>

        看似似乎没有一点问题,这里用到了Mybatis的动态sql,实际上说白了也就是拼sql,不过这个繁杂的工作交给Mybatis帮我们去做了。可是,只要一执行就要报语法错误。调试了好久,发现只要传一个值进去就没有问题,就是list的成员只有一个。这引起了我的警觉。

解决方案
        后来发现,原来mysql的批量更新是要我们主动去设置的, 就是在数据库的连接url上设置一下,加上* &allowMultiQueries=true *即可。

扩展
        实际的业务系统里面oracle数据库也用的非常的多,当然,oracle数据库不需要做特殊的配置,但是相应的sql要做变化。

<update id="updateAllAvailable">
<foreach collection="skuOptionList" item="item" index="index" open="begin" close="end;" separator=";">
update t_xxx
<set>
old_id = #{item.oldId}
</set>
where id = #{item.id}
</foreach>
</update>
mybatis批量操作出现BadSqlGrammarException

用过mybatis的猿友也许使用过它的批量操作(可以参考菜鸟程序猿之mybatis的批量操作),但是其实这个地方有个比较坑爹的问题,如下:

这里为我的映射文件对应的sql

<update parameterType="java.util.Map">
<foreach collection="dmsProdSkuStocks" item="item" separator=";">
UPDATE dms_prod_sku_stock SET
STOCK = #{item.stock}
WHERE SKU_RELATE_ID = #{item.skuRelateId}
</foreach>
</update>
仔细观察,也没发现有什么问题,但是去调用接口执行的时候,程序总是会报出一个错误

org.springframework.jdbc.BadSqlGrammarException:
将其输出的sql放到sqlyog里面执行,也可以成功执行,很难定位问题所在何处。

原来用mybatic 批量操作必须加上参数&allowMultiQueries=true


这参数意思是允许多个查询。

这样就可以放心得使用mybatis的批量操作了!

免责声明:文章转载自《Mysql批量更新的一个坑-&amp;amp;allowMultiQueries=true允许批量更新》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇for循环删除数组中的元素crash问题【java】函数重载下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

.frm和.ibd恢复数据

昨日晚上开发告诉我不小心truncate两个表的数据,要求还原。结果在阿里云上找到了备份内容,结果是物理备份文件.frm、.ibd。心中一万个草泥马啊。。没办法,开始还原吧。 1、查看测试机Mysql配置文件位置 [root@localhost mysql]# which mysqld /usr/sbin/mysq...

kubernetes集群部署mysql 8.0

参考:https://blog.csdn.net/sealir/article/details/81177747?utm_source=blogxgwz1 集群内安装mysql并添加相应存储(PVC)  新建mysql-pvc.yaml、mysql-deploy.yaml和mysql-svc.yaml,分别如下:  先找出当前k8s集群下的storageC...

wireshark抓取mysql协议

一、wireshark抓取mysql协议报文 通过过滤条件过滤出报文 协议 mysql 或端口 tcp.port == 3306 注: mysql 协议默认分析的是 3306端口的数据;如果你的端口不是3306,请先在如下配置修改端口分析 wireshark-》编辑-》首选项-》protocol下找到myqsl 二、网络协议知识...

Linux下安装mysql

Linux下安装mysql1.下载安装包 到mysql官网下载mysql编译好的二进制安装包,在下载页面Select Platform:选项选择linux-generic,然后把页面拉到底部,64位系统下载Linux - Generic (glibc 2.5) (x86, 64-bit),32位系统下载Linux - Generic (glibc 2.5)...

在Linux下安装ADT

现在网络上的好像都是旧版的,我也写一下。 首先说一下eclipse的版本。我们知道,Java EE是企业版,我前面下载Eclipse时还考虑我使用Java SE能否使用。其实可以! 第一步:点开Install New Software来安装插件 第二步:在type or select a site的地方写下: https://dl-ssl.google...

mysql中json取,查,改,去双引号

id title attr 1 李白 {“banji”:“1班”,“xueduan”:“初三”,“xuexiao”:“某某一中”,“jiaoshi_id”:“11,12”} 取值:json_extract(json字段,"$.key值"); 取学校: select json_extract(attr,"$.xuexiao") xuexiao...