MyBatis一次執(zhí)行多條SQL語句的操作
有個常見的場景:刪除用戶的時候需要先刪除用戶的外鍵關(guān)聯(lián)數(shù)據(jù),否則會觸發(fā)規(guī)則報錯。
解決辦法不外乎有三個:
1、多條sql分批執(zhí)行;
2、存儲過程或函數(shù)調(diào)用;
3、sql批量執(zhí)行。
今天我要說的是MyBatis中如何一次執(zhí)行多條語句(使用mysql數(shù)據(jù)庫)。
1、修改數(shù)據(jù)庫連接參數(shù)加上allowMultiQueries=true,如:
hikariConfig.security.jdbcUrl=jdbc:mysql://xx.xx.xx:3306/xxxxx?characterEncoding=utf-8&autoReconnect=true&failOverReadOnly=false&allowMultiQueries=true
2、直接寫多條語句,用“;”隔開即可
<delete parameterType='String'> delete from sec_user_role where userId=#{id}; delete from sec_user where id=#{id};</delete>
僅此而已~
補(bǔ)充知識:【MyBatis】動態(tài)SQL——foreach使用 /批量更新或批量插入
1.foreach的主要用在構(gòu)建in條件中,它可以在SQL語句中進(jìn)行迭代一個集合
2.可以傳遞一個 List 實例或者數(shù)組作為參數(shù)對象傳給 MyBatis。當(dāng)你這么做的時候,MyBatis 會自動將它包裝在一個 Map 中,用名稱作為鍵。List 實例將會以“l(fā)ist”作為鍵,而數(shù)組實例將會以“array”作為鍵
3.foreach的collection能夠支持的三種集合類型list,array以及map
4.foreach元素的屬性主要有 item,index,collection,open,separator,close。
item:集合中每一個元素進(jìn)行迭代時的別名
index:指定一個名字,用于表示在迭代過程中,每次迭代到的位置
collection:若傳遞的是集合,則為list;若傳遞的是數(shù)組,則為array;若傳入的參數(shù)是多個的時候,我們就需要把它們封裝成一個Map或者Object,則為傳入?yún)?shù)map的key即就是參數(shù)名
open:該語句以什么開始
close:以什么結(jié)束
separator:在每次進(jìn)行迭代之間以什么符號作為分隔符
以下是批量更新
一:傳遞單個集合(鍵值是pojo)
UPDATE t_userSET solary=2000WHERE id IN <foreach item='item' index='index' collection='list' separator=',' open='(' close=')'> #{item.id} </foreach>
二:傳遞單個數(shù)組(數(shù)組中是pojo)
UPDATE t_userSET solary=2000WHERE id IN <foreach item='item' index='index' collection='array' separator=',' open='(' close=')'> #{item.id} </foreach>
三:傳遞多個參數(shù)
UPDATE t_userSET solary=2000WHERE id IN <foreach item='item' index='index' collection='ids' separator=',' open='(' close=')'> #{item.id} </foreach>
三者唯一區(qū)別就是collection值不同
以上時提前把要跟新的值查出來放到集合或數(shù)組中,但可不可以IN中放查詢語句那,如:
UPDATE t_user SET solary = 2000 WHERE id IN ( SELECT id FROM t_user WHERE end_time < NOW( ) )
但是這樣是不行的,mysql不允許這樣寫(我猜可能是查的同時不同更改,就如list集合在做查詢錯做時是不能刪除的),但是可以在查詢時查詢,如:
SELECT * FROM t_userWHERE id IN ( SELECT id FROM t_user WHERE end_time < NOW( ) )
以下是批量插入(插入兩條數(shù)據(jù)記錄)
第一次嘗試:
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一次執(zhí)行多條SQL語句的操作就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. 數(shù)據(jù)庫Oracle9i的企業(yè)管理器簡介2. MySQL Community Server 5.1.493. Mysql故障排除:Starting MySQL. ERROR! Manager of pid-file quit without updating file4. Mysql入門系列:在MYSQL結(jié)果集上執(zhí)行計算5. MySQL InnoDB 鎖的相關(guān)總結(jié)6. mysql like語句問題7. 簡單了解mysql語句書寫和執(zhí)行順序8. 巧用SQL語言在ACCESS數(shù)據(jù)庫中批量替換內(nèi)容9. Mysql入門系列:MYSQL圖像數(shù)據(jù)的處理10. 如何實現(xiàn)MySQL數(shù)據(jù)庫的備份與恢復(fù)
