您好,登錄后才能下訂單哦!
本篇內容主要講解“Mybatis動態SQL foreach批量操作方法有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Mybatis動態SQL 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批量操作方法有哪些”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。