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>