Mybatis - 動的 SQL foreach バッチ操作

序文

最近、Mybatis の動的 SQL を勉強していて、ちょうど foreach 要素を学びました。これまで、Mybatis の foreach 要素は、プロジェクト開発のバッチ操作によく使用されていました。ただ、使い方を間違うこともあるので、foreachを使って追加・削除・修正・確認する方法を整理してまとめてみました。このブログを通じて、foreach の使用がより習熟し、効率的になります。

前提知識

Mybatis の foreach を学ぶ前に、mysql バッチ ステートメントの書き方を知る必要があります。mysql バッチ ステートメントの書き方がわからない場合、Mybatis の foreach 要素を使用してバッチ操作を実行するのは、頭のないハエのようなものです. 原理は非常に単純です. Mybatis は永続層フレームワークです. その機能の 1 つは、スプライスすることです. SQL をデータベースに渡して SQL を実行させるというわけで、mybatis では SQL 文のバッチをうまくつなぎ合わせる必要があるので、バッチ操作用の SQL の書き方を使って、Mybatis の構文と組み合わせる方法を使います。

バッチ CRUD SQL ステートメントの結果を記述して実行する方法を見てみましょう。

MySQL バッチ挿入

INSERT INTO tar_course_content_info ( id, course_assembly_id, assembly_content, create_time, created_id, created_by, update_time, updated_id, updated_by, is_delete )
VALUES
    (
            301906655392563202,
            301906577433034752,
            '语文课',
            '2022-07-12 19:13:44',
            'EmE6TKu4okhu3qK5M1AGQ4',
            '张三',
            '2022-07-12 19:13:44',
            'PWeDZyRPADjsdxCNWnSWxZ',
            '王五',
            0 
            ),(
                301906655392563203,
                301906577433034752,
                '数学课',
                '2022-07-12 19:13:44',
                'EmE6TKu4okhu3qK5M1AGQ4',
                '张三',
                '2022-07-12 19:13:44',
                'PWeDZyRPADjsdxCNWnSWxZ',
                '王五',
            0 
    )

実行結果
影響を受ける行数は2行
ここに画像の説明を挿入

MySQL バッチ クエリ

in キーワードを使用します。in キーワードの機能は、特定の範囲内のデータをクエリすることです。

SELECT * FROM tar_course_content_info WHERE is_delete = 0 AND ( created_by, course_assembly_id ) IN (( '张三', 305107474690605056 ),( '李四', 308290117053710337 ))

の結果
ここに画像の説明を挿入

MySQL バッチ変更

UPDATE tar_course_content_info SET created_by='王五' WHERE  course_assembly_id IN( 305107474690605056,308290117053710337)

実行結果
影響を受ける行数は13行
ここに画像の説明を挿入

MySQL 一括削除

DELETE FROM tar_course_content_info where (created_by,id) in (('张三',301906655392563202),('张三',301906655392563203))

実行結果
ここに画像の説明を挿入
でmysql sql文のバッチ操作がわかったら、実際のプロジェクト開発過程でmybatisでforeachを使ってバッチ操作を行う方法を見てみましょう。

バッチ操作には mybatis で foreach を使用します

foreach タグの属性

collection は、反復コレクションの名前を示します
item は、この反復で取得された要素を示します。コレクションが List、Set、または Array の場合、その要素を示します。コレクションが may の場合、key-value の値を示します。 、このパラメーターは必須です
openを選択して、ステートメントが何で始まるかを示します。一般的に使用される左角括弧 "("。何泊、一般的に使用される右角かっこ ")"、mybatis は、foreach でラップされた SQL ステートメントの後に文字列を結合し、一度だけ結合します。このパラメーターはオプションです

セパレータmybatis は、個別の属性で指定された文字を反復ごとに sql に追加します。このパラメータはオプションです。
List、Set、および Array では、 index は現在の反復位置を表します. Map では、index は key-value のキーを表します. このパラメーターはオプションです.
nullableコレクションを null にできるかどうかを示します。デフォルトは false です。true に設定すると、コレクションは null になり、例外はスローされません。

一括挿入

<!--批量插入-->
    <insert id="insertBatch">
                INSERT INTO tar_course_content_info (
                    id,
                    course_assembly_id,
                    assembly_content,
                    create_time,
                    created_id,
                    created_by,
                    update_time,
                    updated_id,
                    updated_by,
                    is_delete
                ) values
                <foreach collection="list" item="item"  separator="," >
                (   #{item.id},
                    #{item.courseAssemblyId},
                    #{item.assemblyContent},
                    #{item.createTime},
                    #{item.createdId},
                    #{item.createdBy},
                    #{item.updateTime},
                    #{item.updatedId},
                    #{item.updatedBy},
                    #{item.iselete}
                )
                </foreach>

    </insert>

の結果
ここに画像の説明を挿入

バッチ クエリ

<!--根据创建人和课程组件id进行批量查询  -->
    <select id="queryAllCourseContentByCreatedByAndCourseAssemblyId" resultMap="courseContentMap">
            SELECT *
            FROM  tar_course_content_info
            WhERE
                is_delete=0
            and
                (created_by, course_assembly_id)
            in
            <foreach collection="list" item="item" open="(" close=")" separator="," nullable="false">
                (#{item.createdBy},#{item.courseAssemblyId})
            </foreach>

    </select>

の結果
ここに画像の説明を挿入

一括編集

最初のケースは、更新する値が同じ場合です。

<!--    根据创建人和内容id进行批量假删除-->
    <update id="updateAllByCreatedByAndContentId">
        UPDATE tar_course_content_info SET is_delete=1 WHERE  (created_by,id) IN

            <foreach collection="list" item="item" open="(" close=")" separator="," >
                 (#{item.createdBy},#{item.id})

            </foreach>


    </update>

実行結果の2番目のケース
ここに画像の説明を挿入
は、更新される値が異なることです:
ここで注意すべきは、接続データに&allowMultiQueries=true
を追加する必要があることです. 機能: バッチ処理を実行し、同時に複数のSQL文を発行できます時間。つまり、SQL ステートメントの後にセミコロンを付けて、複数ステートメントの実行を実装できます。
ここに画像の説明を挿入

<!--    根据课程组件id批量修改创建人姓名-->
    <update id="updateAllCreatedByByCourseAssemblyId" >
        <foreach collection="list" item="item" separator=";" >
        UPDATE tar_course_content_info
        SET
            created_by = #{item.createdBy}
        WHERE
            course_assembly_id = #{item.courseAssemblyId}
        </foreach>

    </update>

の結果
ここに画像の説明を挿入

一括削除

<!--    根据创建人和内容id进行批量删除-->
    <delete id="deleteAllByCreatedByAndContentId">
        DELETE FROM tar_course_content_info where (created_by,id) in

            <foreach collection="list" item="item" open="(" close=")" separator="," nullable="false" index="index">
                (#{item.createdBy},#{item.id})
            </foreach>

    </delete>

の結果
ここに画像の説明を挿入

要約する

  1. 新しいことを学ぶときは、最低限必要な事前知識を身につけないと、効率が極端に悪くなってしまいます。必要最低限​​の知識を習得してから新しいことを学ぶと、半分の労力で 2 倍の成果が得られます。
  2. 理論と実践を組み合わせる。紙の上で学んだことは常に浅はかで、これを知りたければ自分で学ばなければなりません。

おすすめ

転載: blog.csdn.net/wangwei021933/article/details/129632911