天天看點

Mybatis 自定義批量更新

分享知識 傳遞快樂

因為項目需要,需要根據賬号對資料批量更新,而傳統的批量更新是根據id更新,一條一條更新又比較耗時,下面記錄一下對其它字段批量更新的操作。

由于環境使用的Mybatis,在此以mybatis批量更新做示。

1、通過拼接SQL語句進行批量更新

接口定義

int batchUpdate1(List<StudentEntity> list);      

XML檔案

<!-- 通過接收傳進來的參數list進行循環着組裝sql -->

<update id="batchUpdate1" parameterType="list">

    <!-- 接收list參數,循環着組裝sql語句;注意for循環的寫法 separator=";" 代表着每次循環完,在sql後面放一個分号 item="cus" 循環List的每條的結果集 collection="list" list 即為 map傳過來的參數key -->

    <foreach collection="list" separator=";" item="stu">
        update student set
        age = #{stu.age},
        sex = #{stu.sex}
        where name = #{stu.name}
    </foreach>

</update>      

在資料庫連接配接配置中必須添加 &allowMultiQueries=true

如:

jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&serverTimezone=Asia/Shanghai

 &allowMultiQueries=true 意為 允許批量更新,否則在執行SQL時會報以下異常:

Error updating database.  Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'update student set
            age = 2,
            sex = '2021-07-24 08:36:48'      

報錯原因:

是因為spring boot配置檔案中,關于資料庫的連接配接配置,并沒有允許進行批量更新的操作。

這種方式就是通過SQL拼接,單條單條的進行更新,如果行數多的情況下給不建議使用。

2、通過case when語句進行批量更新

接口定義

int batchUpdate2(List<BigDataSearchEntity> list);      

XML檔案

<update id="batchUpdate2" parameterType="list">
    update student
    <trim prefix="set" suffixOverrides=",">
        <trim prefix="age=case" suffix="end,">
            <foreach collection="list" item="stu" index="index">
                <if test="stu.age != null">
                    when name = #{stu.name} then #{stu.age}
                </if>
            </foreach>
        </trim>
        <trim prefix="name=case" suffix="end,">
            <foreach collection="list" item="stu" index="index">
                <if test="stu.sex != null">
                    when id=#{stu.name} then #{stu.sex}
                </if>
            </foreach>
        </trim>
    </trim>
    where
    <foreach collection="list" separator="or" item="stu" index="index">
        name = #{stu.name}
    </foreach>
</update>      
update big_data_search set age=case when name='1428236138892185666' then 52 when name='1428236138892185665' then 42 end 
WHERE name = '1428236138892185666' or name = '1428236138892185665';      
<!-- 批量更新第二種方法,針對單個字段進行批量更新 -->
<update id="batchUpdate2" parameterType="list">
    UPDATE big_data_search
    SET name = CASE
    <foreach collection="list" item="bd" index="index">
        when name=#{bd.name} then #{bd.age}
    </foreach>
    END
    WHERE name IN
    <foreach collection="list" index="index" item="bd" open="(" separator="," close=")">
        #{bd.name}
    </foreach>
</update>