做者 : Stanley 羅昊html
【轉載請註明出處和署名,謝謝!】sql
寫在前面:數組
*本章節適合有Mybatis基礎者觀看*mybatis
使用Mybatis實現動態SQL(一)連接:https://www.cnblogs.com/StanleyBlogs/p/10772878.html#4241746.spa
在上一章內容中,我介紹了一些在xml文件中使用一些標籤來讓咱們一條sql語句更加靈活,那麼下面,我將讓條件變得更加多樣性,根據需求去實現這些功能從而達到練習的目的;code
在工做當中,可能會遇到這樣的業務:xml
批量的刪除或批量的查詢,好比咱們在網購的時候,在購物車中,咱們每每能夠批量的刪除,勾選你想進行刪除的商品,或者根據id批量的對這些數據進行處理,這個時候,咱們確實要根據id去查詢,可是根據一個id,那,確實很簡單,可是要是相似於這種批量型的該怎麼作呢?htm
其實很簡單,只須要用的foreache這樣標籤就能夠了,好比咱們要進行批量刪除,這個時候,傳過來的必定是一串商品id,再也不是單個id,由於批量嘛,因此這個時候傳過來的值咱們能夠把它封裝成list集合,再到咱們的xml文件中,咱們對接收過來的這個集合進行遍歷處理是否是就達到了批量操做的目的啦?對象
foreache能夠迭代的類型:數組、集合、屬性、對象數組blog
咱們先來看一下本次的業務是什麼:
查詢學號爲一、二、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;
迭代屬性的話,首先,咱們須要在學生類中定義一個學號屬性:
學號類名: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>