zoukankan      html  css  js  c++  java
  • Mysql批量更新的一个坑-&allowMultiQueries=true允许批量更新

    前言
            实际上,我们经常会遇到这样的需求,那就是利用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 id="testBatchUpd" 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的批量操作了!

  • 相关阅读:
    Centos 7安装python3
    R贡献文件中文
    Sublime text 3 注册码激活码 版本号3143
    Create R NoteBook require updated versions of the following packages : knitr,rmarkdown.
    vim 的升级 安装 重装
    使用yum快速升级CentOS 6.5内核到 3.10.28
    Container With Most Water——LeetCode
    Majority Element II——LeetCode
    Summary Ranges —— LeetCode
    Contains Duplicate III —— LeetCode
  • 原文地址:https://www.cnblogs.com/Im-Victor/p/11075708.html
Copyright © 2011-2022 走看看