本文在SpringBoot集成MyBaits的情境下,實現高效批量更新。
第一種:
首先能夠想到的是
<update id="updMsg">
<foreach collection="list" item="item" separator=";">
update user_info_ref_project set name=#{item.name},num=#{item.num} where id=#{item.id}
</foreach>
</update>
等同於:
update user_info_ref_project set name= "1"...where id =...
update user_info_ref_project set name= "2"...where id =...
update user_info_ref_project set name= "3"...where id =...
update user_info_ref_project set name= "4"...where id =...
update user_info_ref_project set name= "5"...where id =...
但是這種方法的效率非常低,而且非常消耗數據庫資源,基本相當於在代碼裏面實現循環更新,不可取。
第二種:
利用case when,實質上就是sql的拼接字符串。
<update id="listUpdOssFile" parameterType="com.oss.model.SizeKeyModel">
UPDATE
${micro}_file_record_msg
<--無論有多少個字段都只有一個set標籤,本人在寫的時候,這個地方就出過錯誤,搞了好久才找到原因-->
<trim prefix="SET" suffixOverrides=",">
<trim prefix="file_size =case" suffix="END,">
<foreach collection="fileMsgList" item="item" index="index">
WHEN
oss_key=#{item.key,jdbcType=VARCHAR} AND member_id=#{memberId,jdbcType=BIGINT}
THEN
#{item.fileSize,jdbcType=BIGINT}
</foreach>
</trim>
<--一般有多少個需要動態更新的字段就用幾個這樣的trim標籤-->
<trim prefix="enable =case" suffix="END,">
<foreach collection="fileMsgList" item="item" index="index">
WHEN
oss_key=#{item.key,jdbcType=VARCHAR} AND member_id=#{memberId,jdbcType=BIGINT}
THEN
#{enable}
</foreach>
</trim>
</trim>
WHERE
member_id = #{memberId,jdbcType=BIGINT} AND
oss_key IN
<foreach collection="fileMsgList" index="index" item="item" separator="," open="("
close=")">
#{item.key}
</foreach>
</update>
如果第一種方案算是五條sql,那麼第二種就只是算一條sql,其在MySQL中的展示形式爲:
UPDATE
${micro}_file_record_msg
SET
file_size = (case when oss_key=#{item.key,jdbcType=VARCHAR} then #{item.fileSize,jdbcType=BIGINT}),
enable = (case when oss_key=#{item.key,jdbcType=VARCHAR} then #{item.enable}),
file_size = (case when oss_key=#{item.key,jdbcType=VARCHAR} then #{item.fileSize,jdbcType=BIGINT}),
enable = (case when oss_key=#{item.key,jdbcType=VARCHAR} then #{item.enable}),
file_size = (case when oss_key=#{item.key,jdbcType=VARCHAR} then #{item.fileSize,jdbcType=BIGINT}),
enable = (case when oss_key=#{item.key,jdbcType=VARCHAR} then #{item.enable}),
......
WHERE oss_key in (#{item.key1},#{item.key2},#{item.key3},...)
第二種方案是目前實現批量多字段更新比較好的一種方式,極大的節約了資源。