使用Mybatis實現動態SQL(二)
使用Mybatis實現動態SQL
作者 : Stanley 羅昊
【轉載請註明出處和署名,謝謝!】
寫在前面:
*本章節適合有Mybatis基礎者觀看*
使用Mybatis實現動態SQL(一)連結:https://www.cnblogs.com/StanleyBlogs/p/10772878.html#4241746.
在上一章內容中,我介紹了一些在xml檔案中使用一些標籤來讓我們一條sql語句更加靈活,那麼下面,我將讓條件變得更加多樣性,根據需求去實現這些功能從而達到練習的目的;
在工作當中,可能會遇到這樣的業務:
批量的刪除或批量的查詢,比如我們在網購的時候,在購物車中,我們往往可以批量的刪除,勾選你想進行刪除的商品,或者根據id批量的對這些資料進行處理,這個時候,我們確實要根據id去查詢,但是根據一個id,那,確實很簡單,但是要是類似於這種批量型的該怎麼做呢?
其實很簡單,只需要用的 foreache 這樣標籤就可以了,比如我們要進行批量刪除,這個時候,傳過來的一定是一串商品id,不再是單個id,因為批量嘛,所以這個時候傳過來的值我們可以把它封裝成list集合,再到我們的xml檔案中,我們對接收過來的這個集合進行遍歷處理是不是就達到了批量操作的目的啦?
<foreache>
foreache可以迭代的型別:陣列、集合、屬性、物件陣列
我們先來看一下本次的業務是什麼:
查詢學號為1、2、53的學生資訊;
首先我們先編寫一下sql:
select * from student from student where stuno in(1,2,53)
那麼我現在要通過mybatis傳參,傳一個集合過來,比方說,1 2 53是外界傳進來的,如果我們需要解析的話,我們就需要通過foreach標籤進行解析;
比如會兒我傳進來一個ids,這個ids可能是陣列,或是集合,這個東西里面就包含這三個 1 2 53;
所以,我們的查詢sql語句裡面應該就寫成:
select * from student from student where stuno in(ids)
但是光寫成以上那樣肯定不行,因為語法都不通過,所以,需要通過foreache標籤來進行操作,因為你光寫一個ids Mybatis裡的Xml檔案肯定不認識的,所以我們需要通過標籤來把這個ids給解析出 1 2 53;
使用foreache迭代屬性
迭代屬性的話,首先,我們需要在學生類中定義一個學號屬性:
學號類名:Grade
學生資訊類:Student
//學號
private List<Integer> stuNos;
並且提供gat、set方法;
所以在做專案的時候,在需求中看到需要根據id或者某些唯一的欄位進行批量操作資料,那麼,你就可以把這個類中的這個屬性設定成集合型別;
以上工作準備就緒後,我們就開始在xml檔案中編寫配置了;
首先,我們編寫select標籤,標識本標籤起到查詢的作用,緊接著定義接收值型別:parametetType=“Grade” 返回值型別:resultType = “Student” ;
因為我們要根據Grade類進行查詢,所以,些一個where標籤,讓sql語句靈活起來,內部寫一個if標籤,用來判斷傳過來的這個Grade物件中的stuNos屬性是否有值,如果有,就執行if中的sql語句;
在if中記得加and 因為where可以自動處理第一個and,然後我們把sql語句寫進去,寫完之後先彆著急,因為我們還需要把增強for迴圈寫進去,因為我們需要解析grade中的stuNos這個集合,語法:
<foreache collection = "stuNos" open "and stuno in (" close = ")" item = "ids" sepatator = ","> #{ids} </foreache>
我們發現,我們的查詢條件被分割了,前面的一半時查詢條件+(;後面close括號中是另一半的括號;
後面這個item想必各位都很熟了,沒錯,item雙引號中的ids就是代表著傳過來的stuNos集合中的每一個數據,說白了它就是 1 2 53;
sepatator中寫的是,迭代出來的資料用什麼符號進行分割,如果不寫,你迭代出來的資料就是 1253;
如果1253作為條件,那麼肯定不對,所以我們加了sepatator並且表用用“,”所以迭代出來的資料是這樣的 1,2,53;
接下來,我們完整的寫出來實現按照以上業務完成對xml中編寫動態sql:
<select id = "selectStudentInfoByid" parameterType = "grade" resultType = "Student" > select * from Studnet <where> <if test "stuNos ! = null and stuNos.size>0"> <foreache collection = "stuNos" open "and stuno in (" close = ")" item = "ids" sepatator = ","> #{ids} </foreache> </where> </select>