Mybatis如何實現高效批量多值更新

本文在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},...)

第二種方案是目前實現批量多字段更新比較好的一種方式,極大的節約了資源。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章