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>


    批量更新
    <update id="batchUpdateRecordByKey" parameterType="java.util.List">
    update ms_notice_send_record
    <foreach collection="list" item="item" index="index" open="" close="" separator=";">
    <set>
    <if test="item.status != null">
    `status` = #{item.status}
    </if>
    </set>
    where id = #{item.id}
    </foreach>
    </update>

    批量添加
    <insert id="batchInsertSection" parameterType="list">
    insert into kc_week_pitch_number (week_id, course_id, course_date, section_number, section_start_time, section_end_time,
    create_time, update_time)
    values
    <foreach collection="list" item="item" index="index" separator=",">
    (
    #{item.weekId},
    #{item.courseId},
    #{item.courseDate},
    #{item.sectionNumber},
    #{item.sectionStartTime},
    #{item.sectionEndTime},
    #{item.createTime},
    #{item.updateTime}
    )
    </foreach>
    </insert>

    批量删除
    <delete id="batchDeleteRelation" parameterType="java.util.List">
    delete from bj_teacher_relation_class where id in
    <foreach collection="list" item="item" index="index" open="(" separator="," close=")">
    #{item.id}
    </foreach>
    </delete>

      

  • 相关阅读:
    数据库范式
    服务器防火墙
    Java垃圾回收(GC)机制详解
    Java内存模型
    类加载器
    Java类加载机制
    java虚拟机:Java内存区域及对象
    初识HashMap
    初识LinkedList
    java ArrayList
  • 原文地址:https://www.cnblogs.com/tubashu/p/14894630.html
Copyright © 2011-2022 走看看