首頁 > 軟體

Mybatis動態SQL foreach批次操作方法

2023-03-21 06:00:09

動態SQL Foreach批次操作

前言

最近正在研究Mybatis的動態SQL,正好學習到了foreach元素。之前也是在專案開發中經常會使用到Mybatis的foreach元素進行批次操作。但是有時候就會使用出錯,所以整理和總結了關於使用foreach進行增刪改查的方法。通過這篇部落格詳細對於foreach的使用將會更加熟練和高效。

前置必要知識

在學習Mybatis的foreach之前,我們需要掌握到mysql的批次語句是如何書寫的。如果不清楚mysql批次語句怎麼書寫那麼在使用Mybatis的foreach元素進行批次操作就跟無頭蒼蠅一樣,原理很簡單,mybatis是一種持久層框架,其中一個作用就是拼接SQL並交給資料庫執行SQL,所以在mybatis中我們需要將批次的SQL語句拼接成功,所以就會用到批次操作的SQL怎麼書寫,然後才是怎麼和Mybatis的語法結合。

讓我們來看看批次的增刪改查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 表示本次迭代的獲取的元素,如果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!


IT145.com E-mail:sddin#qq.com