1. 程式人生 > >Mysql批量更新及插入(引數為Map)

Mysql批量更新及插入(引數為Map)

前言

        這個問題困擾了整整一天。          當遇到多條記錄需要插入或者更新的時候,往往會使用批量操作來提高效率,提高效能。然而在使用過程中確是出現了各種問題,真的是有些坑只有趟過才知道!!!          好了,話不多說,進入正題。          注:資料庫Mysql     持久層框架 Mybatis

一、批量更新

需求如下程式碼:
		Map<String,Object> ucmap = new HashMap<String, Object>();
		ucmap.put("updateUser","zyong");
		ucmap.put("updateTime", time);
		ucmap.put("list", updateClist);
		connectorInfoMapper.updateBatch(ucmap);
這裡的需求是對裝置的資訊進行批量更新,利用Map來傳參,Map中包含了一個List,這個List包含了需要更新的物件集合,也就是多條記錄。 sql片段如下:
<update id="updateBatch" parameterType="java.util.Map">
      <foreach collection="list" item="item" index="index" separator=";">
 update connector_info
    set  
      Connector_Type = #{item.connectorType,jdbcType=INTEGER},
      Voltage_Upper_Limits = #{item.voltageUpperLimits,jdbcType=INTEGER},
      Voltage_Lower_Limits = #{item.voltageLowerLimits,jdbcType=INTEGER},
      Current = #{item.current,jdbcType=INTEGER},
      Power = #{item.power,jdbcType=DOUBLE},
      National_Standard = #{item.nationalStandard,jdbcType=INTEGER},
      Update_User = #{updateUser,jdbcType=VARCHAR},
	  Update_Time = FROM_UNIXTIME(#{updateTime,jdbcType=TIMESTAMP})   
    where Connector_ID = #{item.connectorId,jdbcType=VARCHAR}
    </foreach>
 </update>
        可以看到,這裡使用了foreach標籤進行迭代,item代表著每一個元素,item.power等代表的就是每個元素的屬性,而沒有加上item的引數如updateUser、updateTime等則是存放在Map中的引數,從需求程式碼中能看得更加明顯。 當我檢查了多遍後,感覺沒問題之後,執行。 控制檯的錯誤讓我明白還是太年輕——報錯了!!!仔細一看,是Sql語法錯誤,What?我把sql放入Navicat中美化,又檢查了好幾遍,這明明沒有錯啊! 於是開啟了百度,各種查:
  • 有的說把separator=";"中的分號換成——separator="UNION ALL",測試,還是報同樣的錯誤。
  • 將幾個屬於Map的欄位刪除再測試,依然報錯
查了很多並沒有什麼實質性的進展,將多條資料改成一條資料進行更新,測試,竟然通過了!——原因很明顯:批量操作的原因導致。 再百度,終於找到了答案:         並不是Sql的原因,而是資料庫設定的原因————Mysql需要開啟批量更新的設定。         需要在資料庫JDBC連結中加入: &allowMultiQueries=true 如下: jdbc.url=jdbc:mysql://139.224.35.81:3306/evshare?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true 在添加了這個“開關”之後,成功批量更新多條資料。 二、批量插入 相比於批量更新,批量插入則沒有類似的設定。 一個簡單的示例Sql:
<insert id="insertBatch" parameterType="java.util.Map">
  insert into connector_info (Equipment_Seq, Connector_ID, 
      Connector_Type, Voltage_Upper_Limits, 
      Voltage_Lower_Limits, Current, Power, 
      National_Standard,Create_User,Create_Time,Update_Time)
      values
      <foreach collection="list" item="item" index="index" separator=",">
     (#{item.equipmentSeq,jdbcType=BIGINT}, #{item.connectorId,jdbcType=VARCHAR}, 
      #{item.connectorType,jdbcType=INTEGER}, #{item.voltageUpperLimits,jdbcType=INTEGER}, 
      #{item.voltageLowerLimits,jdbcType=INTEGER}, #{item.current,jdbcType=INTEGER}, #{item.power,jdbcType=DOUBLE}, 
      #{item.nationalStandard,jdbcType=INTEGER},
      #{createUser,jdbcType=VARCHAR},
      FROM_UNIXTIME(#{createTime,jdbcType=TIMESTAMP}),
      FROM_UNIXTIME(#{updateTime,jdbcType=TIMESTAMP}))
      </foreach>
  </insert>

總結: 1. 有時候問題並不是出現在程式碼上,可以往系統環境和配置方面考慮。

            2. 對於批量更新Mysql需要設定,而Oracle則不需要設定,但sql可能要變化