1. 程式人生 > 程式設計 >MyBatis一次執行多條SQL語句的操作

MyBatis一次執行多條SQL語句的操作

有個常見的場景:刪除使用者的時候需要先刪除使用者的外來鍵關聯資料,否則會觸發規則報錯。

解決辦法不外乎有三個

1、多條sql分批執行;

2、儲存過程或函式呼叫;

3、sql批量執行。

今天我要說的是MyBatis中如何一次執行多條語句(使用mysql資料庫)。

1、修改資料庫連線引數加上allowMultiQueries=true,如:

hikariConfig.security.jdbcUrl=jdbc:mysql://xx.xx.xx:3306/xxxxx?characterEncoding=utf-8&autoReconnect=true&failOverReadOnly=false&allowMultiQueries=true

2、直接寫多條語句,用“;”隔開即可

<delete id="deleteUserById" parameterType="String">
 delete from sec_user_role where userId=#{id};
 delete from sec_user where id=#{id};
</delete>

僅此而已~

補充知識:【MyBatis】動態SQL——foreach使用 /批量更新或批量插入

1.foreach的主要用在構建in條件中,它可以在SQL語句中進行迭代一個集合

2.可以傳遞一個 List 例項或者陣列作為引數物件傳給 MyBatis。當你這麼做的時候,MyBatis 會自動將它包裝在一個 Map 中,用名稱作為鍵。List 例項將會以“list”作為鍵,而陣列例項將會以“array”作為鍵

3.foreach的collection能夠支援的三種集合型別list,array以及map

4.foreach元素的屬性主要有 item,index,collection,open,separator,close。

item:集合中每一個元素進行迭代時的別名

index:指定一個名字,用於表示在迭代過程中,每次迭代到的位置

collection:若傳遞的是集合,則為list;若傳遞的是陣列,則為array;若傳入的引數是多個的時候,我們就需要把它們封裝成一個Map或者Object,則為傳入引數map的key即就是引數名

open:該語句以什麼開始

close:以什麼結束

separator:在每次進行迭代之間以什麼符號作為分隔符

以下是批量更新

一:傳遞單個集合(鍵值是pojo)

UPDATE t_user
SET solary=2000
WHERE
 id IN 
 <foreach item="item" index="index" collection="list" separator="," open="(" close=")"> 
 #{item.id}
 </foreach>

二:傳遞單個數組(陣列中是pojo)

UPDATE t_user
SET solary=2000
WHERE
 id IN 
 <foreach item="item" index="index" collection="array" separator="," open="(" close=")"> 
 #{item.id}
 </foreach>

三:傳遞多個引數

UPDATE t_user
SET solary=2000
WHERE
 id IN 
 <foreach item="item" index="index" collection="ids" separator="," open="(" close=")"> 
 #{item.id}
 </foreach>

三者唯一區別就是collection值不同

以上時提前把要跟新的值查出來放到集合或陣列中,但可不可以IN中放查詢語句那,如:

UPDATE t_user 
 SET solary = 2000 
WHERE
 id IN ( SELECT id FROM t_user WHERE end_time < NOW( ) )

但是這樣是不行的,mysql不允許這樣寫(我猜可能是查的同時不同更改,就如list集合在做查詢錯做時是不能刪除的),但是可以在查詢時查詢,如:

SELECT * 
 FROM t_user
WHERE
 id IN ( SELECT id FROM t_user WHERE end_time < NOW( ) )

以下是批量插入(插入兩條資料記錄)

第一次嘗試:

INSERT t_usr ( NAME )
VALUES
 < foreach collection = "list" item = "user" OPEN = "(" CLOSE = ")" SEPARATOR = "," >
 #{user.name}
 </ foreach>

解析的sql為:

INSERT t_usr (name ) VALUES ( ?,? )

報如下錯誤:

Cause: java.sql.SQLException: Column count doesn't match value count at row 1

第二次嘗試:

INSERT t_usr (NAME )
VALUES
 < foreach collection = "list" item = "user" OPEN = "" CLOSE = "" SEPARATOR = "," > 
 (#{user.name})
 </ foreach>

解析的sql為: INSERT t_usr (id,name ) VALUES (?),(?)

正確插入

以上這篇MyBatis一次執行多條SQL語句的操作就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。