[転送] Mybatis でバッチ更新を実装するにはいくつかの方法があり、常に適切なものが存在します。

Mybatis でバッチ更新を実装するにはいくつかの方法があり、常に適切なものが存在します。

I. 概要

mybatis でのバッチ挿入の実装は非常に簡単ですが、皆さんご存知のとおり、ここでは詳しく説明しませんが、この記事では主にバッチ更新の実装方法について説明します。

この記事で紹介する以下の方法は、主に XML で実装されており、コード ロジックの変更が必要な方法は含まれていません。ここでは、インターネット上で言及されている一般的な状況に加えて、MySQL に適したバッチ更新方法も紹介しています。および Oracle: 1. 場合 2 . foreach を複数の SQL に変換 3. ON DUPLICATE KEY UPDATE (mysql) 4. replace into (mysql)

今回はこの4つの方法についてお話します。

二、case when

この方法で実装されたバッチ更新操作は非常に非効率的であり、更新するフィールドが多数ある場合、SQL ステートメントは特に長くなるでしょう。

<update id="updateBatch">
    update t_calendar_extend
    <trim prefix="set" suffixOverrides=",">
        <trim prefix="modify_time = case index" suffix="end,">
            <foreach collection="list" item="item">
                when #{item.index} then #{item.modifyTime}
            </foreach>
        </trim>
        <trim prefix="user_type = case index" suffix="end">
            <foreach collection="list" item="item">
                when #{item.index} then #{item.type}
            </foreach>
        </trim>
    </trim>
    <where>
        index in (
        <foreach collection="list" separator="," item="item">
            #{item.index}
        </foreach>
        )
    </where>
</update>

ここで、modify_time と user_type の値はインデックス値に基づいて更新されますが、フィールドが複数あり、何度も走査する必要があり、非常に非効率です。

3. 複数の SQL に Foreach する

この方法は最も単純で、foreach を使用して複数の更新ステートメントを組み立てます。ただし、Mybatis マッピング ファイルの SQL ステートメントはデフォルトで「;」で終わることをサポートしていないため、複数の SQL ステートメントの実行はサポートされていません。 。したがって、実行する前に、mysql に接続する URL に &allowMultiQueries=true を追加する必要があります。

<update id="updateBatch"  parameterType="java.util.List">  
    <foreach collection="list" item="item" index="index" open="" close="" separator=";">
        update tableName
        <set>
            name=${item.name},
            name2=${item.name2}
        </set>
        where id = ${item.id}
    </foreach>      
</update>

四、重複キーの更新について

MYSQL の ON DUPLICATE KEY UPDATE は、主キー (PRIMARY KEY) または一意のインデックス (UNIQUE INDEX) に基づいて使用されます。

一意の識別子または主キーがすでに存在する場合は更新され、一意の識別子または主キーが存在しない場合は新しい行として挿入されます。

<update id="updateBatch">
    insert into t_output_calendar (index, 
      cal_date, user_type, create_time, 
      modify_time, delete_flag
      )
    values
    <foreach collection="list" item="item" index="index"
        separator=",">
        (
        #{item.index,jdbcType=INTEGER}, 
        #{item.calDate,jdbcType=TIMESTAMP}, 
        #{item.type,jdbcType=TINYINT}, 
        #{item.createTime,jdbcType=TIMESTAMP}, 
        #{item.modifyTime,jdbcType=TIMESTAMP}, 
        #{item.deleteFlag,jdbcType=TINYINT}
        )
    </foreach>
    ON DUPLICATE KEY UPDATE modify_time = VALUES(modify_time), user_type = VALUES(user_type);
</update>

5. に置き換えます

msql の replace into は、insert into とまったく同じように使用されますが、更新関数があります。

このデータ行が (主キーまたは一意のインデックスに基づいて) テーブルに既に存在していることが判明した場合は、まずデータ行が削除され、次に新しいデータが挿入されます。それ以外の場合は、新しいデータが直接挿入されます。

最初にデータを削除してから挿入することに注意してください。これはON DUPLICATE KEY UPDATEこれとは異なります。現在のデータベース ユーザーに削除権限がない場合、replace into は使用できません。

例:

<insert id="updateBatch" parameterType="java.util.List">
    replace into t_output_calendar (index, cal_date, user_type, create_time, 
      modify_time, delete_flag
      )
    values
    <foreach collection="list" item="item" index="index"
        separator=",">
        (
        #{item.index,jdbcType=INTEGER}, 
        #{item.calDate,jdbcType=TIMESTAMP}, 
        #{item.type,jdbcType=TINYINT}, 
        #{item.createTime,jdbcType=TIMESTAMP}, 
        #{item.modifyTime,jdbcType=TIMESTAMP}, 
        #{item.deleteFlag,jdbcType=TINYINT}
        )
    </foreach>
</insert>

おすすめ

転載: blog.csdn.net/mao_mao37/article/details/133384136