<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
最近正在研究Mybatis的動態SQL,正好學習到了foreach元素。之前也是在專案開發中經常會使用到Mybatis的foreach元素進行批次操作。但是有時候就會使用出錯,所以整理和總結了關於使用foreach進行增刪改查的方法。通過這篇部落格詳細對於foreach的使用將會更加熟練和高效。
在學習Mybatis的foreach之前,我們需要掌握到mysql的批次語句是如何書寫的。如果不清楚mysql批次語句怎麼書寫那麼在使用Mybatis的foreach元素進行批次操作就跟無頭蒼蠅一樣,原理很簡單,mybatis是一種持久層框架,其中一個作用就是拼接SQL並交給資料庫執行SQL,所以在mybatis中我們需要將批次的SQL語句拼接成功,所以就會用到批次操作的SQL怎麼書寫,然後才是怎麼和Mybatis的語法結合。
讓我們來看看批次的增刪改查SQL語句如何書寫和執行結果。
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行
使用in關鍵字,in關鍵字的作用是查詢某個範圍內的資料
SELECT * FROM tar_course_content_info WHERE is_delete = 0 AND ( created_by, course_assembly_id ) IN (( '張三', 305107474690605056 ),( '李四', 308290117053710337 ))
執行結果
UPDATE tar_course_content_info SET created_by='王五' WHERE course_assembly_id IN( 305107474690605056,308290117053710337)
執行結果
已經受影響的行數為13行
DELETE FROM tar_course_content_info where (created_by,id) in (('張三',301906655392563202),('張三',301906655392563203))
執行結果
知道mysql的sql語句的批次操作之後,我們再看看在實際專案開發過程中,如何使用mybatis中的foreach進行批次操作。
collection表示迭代集合的名稱
item 表示本次迭代的獲取的元素,如果collection為List、Set、或者Array,則表示其中的元素;若collection為may,則表示key-value中的value,該引數為必選
open 表示該語句以什麼開始,常用的為左括弧 “(”,mybatis會將該字串拼接到foreach包裹的sql語句之前,並且只拼接一次,該引數為可選項。
close 表示該語句以什麼借宿,常用的為右括弧")",mybatis會將該字串拼接到foreach包裹的sql語句之後,並且只拼接一次,該引數為可選項。
separator mybatis會在每次迭代後給sql加上separate屬性制定的字元,該引數為可選項。
index 在List、Set和Array表示當前迭代的位置,在Map中,index表示key-value中的key,該引數為可選項。
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>
執行結果
第二種情況是需更新的值不同:
這裡需要注意,需要在連線資料是新增 &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>
執行結果
學習一個新東西的時候,需要思考的是有哪些最少必要的前置知識我必須掌握,不然效率極慢。掌握最少必要知識之後開始新東西的學習會事半功倍。理論和實踐相結合。紙上得來終覺淺,欲知此事須躬行。
到此這篇關於Mybatis動態SQL foreach批次操作的文章就介紹到這了,更多相關Mybatis動態SQL foreach內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45