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;當抽象方法的參數超過1個,就一定添加瞭@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註入的風險!

到此這篇關於Mybatis 如何批量刪除數據的實現示例的文章就介紹到這瞭,更多相關Mybatis 批量刪除數據內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: