使用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>