Mysql批量更新及插入(引數為Map)
阿新 • • 發佈:2019-02-05
前言
這個問題困擾了整整一天。 當遇到多條記錄需要插入或者更新的時候,往往會使用批量操作來提高效率,提高效能。然而在使用過程中確是出現了各種問題,真的是有些坑只有趟過才知道!!! 好了,話不多說,進入正題。 注:資料庫Mysql 持久層框架 Mybatis一、批量更新
需求如下程式碼:這裡的需求是對裝置的資訊進行批量更新,利用Map來傳參,Map中包含了一個List,這個List包含了需要更新的物件集合,也就是多條記錄。 sql片段如下:Map<String,Object> ucmap = new HashMap<String, Object>(); ucmap.put("updateUser","zyong"); ucmap.put("updateTime", time); ucmap.put("list", updateClist); connectorInfoMapper.updateBatch(ucmap);
可以看到,這裡使用了foreach標籤進行迭代,item代表著每一個元素,item.power等代表的就是每個元素的屬性,而沒有加上item的引數如updateUser、updateTime等則是存放在Map中的引數,從需求程式碼中能看得更加明顯。 當我檢查了多遍後,感覺沒問題之後,執行。 控制檯的錯誤讓我明白還是太年輕——報錯了!!!仔細一看,是Sql語法錯誤,What?我把sql放入Navicat中美化,又檢查了好幾遍,這明明沒有錯啊! 於是開啟了百度,各種查:<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>
- 有的說把separator=";"中的分號換成——separator="UNION ALL",測試,還是報同樣的錯誤。
- 將幾個屬於Map的欄位刪除再測試,依然報錯
<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>