Mybatis動態(tài)SQL?foreach批量操作方法
動態(tài)SQL Foreach批量操作
前言
最近正在研究Mybatis的動態(tài)SQL,正好學(xué)習(xí)到了foreach元素。之前也是在項目開發(fā)中經(jīng)常會使用到Mybatis的foreach元素進(jìn)行批量操作。但是有時候就會使用出錯,所以整理和總結(jié)了關(guān)于使用foreach進(jìn)行增刪改查的方法。通過這篇博客詳細(xì)對于foreach的使用將會更加熟練和高效。
前置必要知識
在學(xué)習(xí)Mybatis的foreach之前,我們需要掌握到mysql的批量語句是如何書寫的。如果不清楚mysql批量語句怎么書寫那么在使用Mybatis的foreach元素進(jìn)行批量操作就跟無頭蒼蠅一樣,原理很簡單,mybatis是一種持久層框架,其中一個作用就是拼接SQL并交給數(shù)據(jù)庫執(zhí)行SQL,所以在mybatis中我們需要將批量的SQL語句拼接成功,所以就會用到批量操作的SQL怎么書寫,然后才是怎么和Mybatis的語法結(jié)合。
讓我們來看看批量的增刪改查SQL語句如何書寫和執(zhí)行結(jié)果。
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,
'數(shù)學(xué)課',
'2022-07-12 19:13:44',
'EmE6TKu4okhu3qK5M1AGQ4',
'張三',
'2022-07-12 19:13:44',
'PWeDZyRPADjsdxCNWnSWxZ',
'王五',
0
)執(zhí)行結(jié)果
已經(jīng)受影響的行數(shù)為2行

MySQL批量查詢
使用in關(guān)鍵字,in關(guān)鍵字的作用是查詢某個范圍內(nèi)的數(shù)據(jù)
SELECT * FROM tar_course_content_info WHERE is_delete = 0 AND ( created_by, course_assembly_id ) IN (( '張三', 305107474690605056 ),( '李四', 308290117053710337 ))
執(zhí)行結(jié)果

MySQL批量修改
UPDATE tar_course_content_info SET created_by='王五' WHERE course_assembly_id IN( 305107474690605056,308290117053710337)
執(zhí)行結(jié)果
已經(jīng)受影響的行數(shù)為13行

MySQL批量刪除
DELETE FROM tar_course_content_info where (created_by,id) in (('張三',301906655392563202),('張三',301906655392563203))執(zhí)行結(jié)果

知道m(xù)ysql的sql語句的批量操作之后,我們再看看在實際項目開發(fā)過程中,如何使用mybatis中的foreach進(jìn)行批量操作。
使用mybatis中的foreach進(jìn)行批量操作
foreach標(biāo)簽的各個屬性
collection表示迭代集合的名稱
item 表示本次迭代的獲取的元素,如果collection為List、Set、或者Array,則表示其中的元素;若collection為may,則表示key-value中的value,該參數(shù)為必選
open 表示該語句以什么開始,常用的為左括弧 “(”,mybatis會將該字符串拼接到foreach包裹的sql語句之前,并且只拼接一次,該參數(shù)為可選項。
close 表示該語句以什么借宿,常用的為右括弧")",mybatis會將該字符串拼接到foreach包裹的sql語句之后,并且只拼接一次,該參數(shù)為可選項。
separator mybatis會在每次迭代后給sql加上separate屬性制定的字符,該參數(shù)為可選項。
index 在List、Set和Array表示當(dāng)前迭代的位置,在Map中,index表示key-value中的key,該參數(shù)為可選項。
nullable 表示集合是否可以為null,默認(rèn)為false,當(dāng)設(shè)置為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>
執(zhí)行結(jié)果

批量查詢
<!--根據(jù)創(chuàng)建人和課程組件id進(jìn)行批量查詢 -->
<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>執(zhí)行結(jié)果

批量修改
第一種情況是需更新的值相同:
<!-- 根據(jù)創(chuàng)建人和內(nèi)容id進(jìn)行批量假刪除-->
<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>執(zhí)行結(jié)果

第二種情況是需更新的值不同:
這里需要注意,需要在連接數(shù)據(jù)是添加 &allowMultiQueries=true
作用:可以執(zhí)行批處理,同時發(fā)出多個SQL語句。也就是可以在sql語句后攜帶分號,實現(xiàn)多語句執(zhí)行。

<!-- 根據(jù)課程組件id批量修改創(chuàng)建人姓名-->
<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>執(zhí)行結(jié)果

批量刪除
<!-- 根據(jù)創(chuàng)建人和內(nèi)容id進(jìn)行批量刪除-->
<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>執(zhí)行結(jié)果

總結(jié)
學(xué)習(xí)一個新東西的時候,需要思考的是有哪些最少必要的前置知識我必須掌握,不然效率極慢。掌握最少必要知識之后開始新東西的學(xué)習(xí)會事半功倍。理論和實踐相結(jié)合。紙上得來終覺淺,欲知此事須躬行。
到此這篇關(guān)于Mybatis動態(tài)SQL foreach批量操作的文章就介紹到這了,更多相關(guān)Mybatis動態(tài)SQL foreach內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot多模塊化整合mybatis,mapper自動注入失敗問題及解決
這篇文章主要介紹了springboot多模塊化整合mybatis,mapper自動注入失敗問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01
淺析java修飾符訪問權(quán)限(動力節(jié)點Java學(xué)院整理)
Java有四種訪問權(quán)限,其中三種有訪問權(quán)限修飾符,分別為private,public和protected,還有一種不帶任何修飾符,下面通過本文給大家簡單介紹下java修飾符訪問權(quán)限相關(guān)知識,感興趣的朋友一起學(xué)習(xí)吧2017-04-04
十分簡單易懂的Java應(yīng)用程序性能調(diào)優(yōu)技巧分享
這篇文章主要介紹了十分簡單易懂的Java性能調(diào)優(yōu)技巧分享,具有一定參考價值,需要的朋友可以了解下。2017-11-11

