Mybatis 如何批量刪除資料
Mybatis如何批量刪除資料
本期以最常用的根據id批量刪除資料為例:
介面設計1:List型別單引數
Integer deleteByIds(List<Integer> ids);
介面設計2:Array陣列型別單引數
Integer deleteByIds(Integer[] ids);
介面設計3:可變長度引數
Integer deleteByIds(Integer... ids);
此以介面2為例子mapper.xml配置如下:
<delete id="deleteByIds">
DELETE FROM t_user WHERE id IN (
<foreach collection="array" item="id" separator=",">
#{id}
</foreach>
)
</delete>
關於<foreach>
節點的配置說明:
-
collection
:需要被遍歷的物件,當抽象方法的引數只有1個且沒有新增@Param
註解時,如果引數型別是List
集合,則取值為list
,如果引數型別是陣列,則取值為array
@Param
註解,則取值為@Param
註解配置的引數值;
如下圖介面所示:
-
item
:遍歷過程中的每一個元素資料,當前屬性可以自定義值表示元素資料的名稱,在<foreach>
節點的子級,使用#{}
佔位符時,就可以使用這個名稱來表示資料; -
separator
:遍歷生成的程式碼片段中,各元素資料之間的分隔符號; -
open
/close
:遍歷生成的程式碼片段的最左側字串/最右側字串。
補充知識點:關於#{}和${}格式的佔位符
MyBatis允許在配置SQL語句時使用#{}
和${}
這2種格式的佔位符來表示引數值。
簡單原則:在原本使用JDBC技術程式設計時,編寫SQL語句時可以寫問號(?
#{}
格式的佔位符,不可以寫問號的位置,必須使用${}
格式的佔位符!
使用#{}
格式的佔位符,只能表示某個值!MyBatis在處理時,會通過預編譯的方式進行處理,即:先使用問號對佔位符表示的值進行佔位,並將整個SQL語句交由MySQL進行編譯相關的處理(包括詞法分析、語義分析、編譯),當編譯完成後,再將值代入到編譯成功的SQL語句中一併執行。簡單來說,使用#{}
格式的佔位符時,最終處理機制是使用了預編譯的!所以,使用這種格式的佔位符時,在編寫SQL時不需要關心值的資料型別的問題,並且,不存在SQL注入的風險!
使用${}
格式的佔位符,可以表示SQL語句中的任意片段!MyBatis在處理時,會先將${}
格式佔位符對應的值拼接到SQL語句中,然後再將SQL語句交由MySQL進行編譯相關處理,也就是說,${}
格式佔位符的值在編譯之前就已經代入到SQL語句中了!很顯然,在處理${}
格式的佔位符時,沒有(也不可能)使用預編譯!所以,使用這種格式的佔位符時,需要自行在SQL語句中考慮資料型別的問題,例如字串型別的值需要使用一對單引號框住!另外,還存在SQL注入的風險!
好了,以上就是本期內容,有不懂的可以留言或者私信喔!