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的批量操作了!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM