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