Mybatis動(dòng)態(tài)SQL?foreach批量操作方法
動(dòng)態(tài)SQL Foreach批量操作
前言
最近正在研究Mybatis的動(dòng)態(tài)SQL,正好學(xué)習(xí)到了foreach元素。之前也是在項(xiàng)目開發(fā)中經(jīng)常會(huì)使用到Mybatis的foreach元素進(jìn)行批量操作。但是有時(shí)候就會(huì)使用出錯(cuò),所以整理和總結(jié)了關(guān)于使用foreach進(jìn)行增刪改查的方法。通過這篇博客詳細(xì)對(duì)于foreach的使用將會(huì)更加熟練和高效。
前置必要知識(shí)
在學(xué)習(xí)Mybatis的foreach之前,我們需要掌握到mysql的批量語句是如何書寫的。如果不清楚mysql批量語句怎么書寫那么在使用Mybatis的foreach元素進(jìn)行批量操作就跟無頭蒼蠅一樣,原理很簡單,mybatis是一種持久層框架,其中一個(gè)作用就是拼接SQL并交給數(shù)據(jù)庫執(zhí)行SQL,所以在mybatis中我們需要將批量的SQL語句拼接成功,所以就會(huì)用到批量操作的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)鍵字的作用是查詢某個(gè)范圍內(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語句的批量操作之后,我們?cè)倏纯丛趯?shí)際項(xiàng)目開發(fā)過程中,如何使用mybatis中的foreach進(jìn)行批量操作。
使用mybatis中的foreach進(jìn)行批量操作
foreach標(biāo)簽的各個(gè)屬性
collection表示迭代集合的名稱
item 表示本次迭代的獲取的元素,如果collection為List、Set、或者Array,則表示其中的元素;若collection為may,則表示key-value中的value,該參數(shù)為必選
open 表示該語句以什么開始,常用的為左括弧 “(”,mybatis會(huì)將該字符串拼接到foreach包裹的sql語句之前,并且只拼接一次,該參數(shù)為可選項(xiàng)。
close 表示該語句以什么借宿,常用的為右括弧")",mybatis會(huì)將該字符串拼接到foreach包裹的sql語句之后,并且只拼接一次,該參數(shù)為可選項(xiàng)。
separator mybatis會(huì)在每次迭代后給sql加上separate屬性制定的字符,該參數(shù)為可選項(xiàng)。
index 在List、Set和Array表示當(dāng)前迭代的位置,在Map中,index表示key-value中的key,該參數(shù)為可選項(xiàng)。
nullable 表示集合是否可以為null,默認(rèn)為false,當(dāng)設(shè)置為true時(shí)集合為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í)行批處理,同時(shí)發(fā)出多個(gè)SQL語句。也就是可以在sql語句后攜帶分號(hào),實(shí)現(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í)一個(gè)新東西的時(shí)候,需要思考的是有哪些最少必要的前置知識(shí)我必須掌握,不然效率極慢。掌握最少必要知識(shí)之后開始新東西的學(xué)習(xí)會(huì)事半功倍。理論和實(shí)踐相結(jié)合。紙上得來終覺淺,欲知此事須躬行。
到此這篇關(guān)于Mybatis動(dòng)態(tài)SQL foreach批量操作的文章就介紹到這了,更多相關(guān)Mybatis動(dòng)態(tài)SQL foreach內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java面向?qū)ο蠡A(chǔ)知識(shí)之抽象類和接口
這篇文章主要介紹了Java面向?qū)ο蟮某橄箢惡徒涌?文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有很好的幫助,需要的朋友可以參考下2021-11-11springboot無法跳轉(zhuǎn)頁面的問題解決方案
這篇文章主要介紹了springboot無法跳轉(zhuǎn)頁面的問題解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09Java abstract class 與 interface對(duì)比
這篇文章主要介紹了 Java abstract class 與 interface對(duì)比的相關(guān)資料,需要的朋友可以參考下2016-12-12java高并發(fā)下解決AtomicLong性能瓶頸方案LongAdder
這篇文章主要為大家介紹了java高并發(fā)下解決AtomicLong性能瓶頸方案LongAdder,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12JDK9為何要將String的底層實(shí)現(xiàn)由char[]改成了byte[]
String 類的源碼已經(jīng)由?char[]?優(yōu)化為了?byte[]?來存儲(chǔ)字符串內(nèi)容,為什么要這樣做呢?本文就詳細(xì)的介紹一下,感興趣的可以了解一下2022-03-03Java+MySql圖片數(shù)據(jù)保存與讀取的具體實(shí)例
之前一直沒有做過涉及到圖片存儲(chǔ)的應(yīng)用,最近要做的東東涉及到了這個(gè)點(diǎn),就做了一個(gè)小的例子算是對(duì)圖片存儲(chǔ)的初試吧2013-06-06SpringBoot HttpMessageConverter消息轉(zhuǎn)換器的使用詳解
在整個(gè)數(shù)據(jù)流轉(zhuǎn)過程中,前端的請(qǐng)求報(bào)文轉(zhuǎn)化為Java對(duì)象,Java對(duì)象轉(zhuǎn)化為響應(yīng)報(bào)文,這里就用到了消息轉(zhuǎn)換器HttpMessageConverter2022-06-06