1. 程式人生 > >mybatis中sql傳入引數為集合、陣列時解決方式

mybatis中sql傳入引數為集合、陣列時解決方式

平時我們寫sql時只需要傳入一個查詢引數或者幾個不同欄位的引數就足夠了,但是如果傳入的引數是集合、陣列的時候該怎麼辦呢?
mybatis中的<foreach>標籤很好的提供了對這類問題的解決方法,利用<foreach>標籤可以實現sql條件的迴圈,這樣這個問題就能很好的解決了
<foreach>標籤的主要屬性有:
1、item:集合中的一個元素,表示集合每一個元素進行迭代時的別名
2、index:索引,表示在迭代過程中,每次迭代到的位置
3、separator:表示每次迭代之間以什麼符號作為分隔
4、open:表示該語句以什麼開始
5、close:表示該語句以什麼結束
6、collection:需要迭代的變數
collection的值其實就是mybatis把引數轉化成Map以後這個Map的key,這個key對應的value必須是一個集合或者陣列

例: 

<foreach collection="roles" item="role" open="" close="" separator="OR">  
   role = #{role}  
</foreach>
此外,mybatis常用的標籤還有where、if、set、choose、trim等

1、where標籤

一般我們寫sql語句都要寫where條件,如果傳入的引數是空的,此時查詢出的結果很可能是空的,也許我們需要引數為空時,但卻查出了全部的資訊。這時我們可以使用動態sql,增加一個判斷,當引數不符合要求的時候,我們可以不去判斷此查詢條件。where標籤就相當於where關鍵字,可以自動去除第一個and。

2、if標籤

if標籤一般配合where標籤使用,進行傳入引數的判斷

3、set標籤

當在update語句中使用if標籤時,如果前面的if沒有執行,則或導致逗號多餘錯誤。使用set標籤可以將動態的配置set關鍵字

剔除追加到條件

末尾的任何不相關的逗號。

4、choose標籤

有時候我們並不想應用所有的條件,而只是想從多個選項中選擇一個。MyBatis提供了choose 元素,按順序判斷when中的否成立,如果有一個成立,則choose結束。當choose中所有when的條件都不滿時,則執行 otherwise中的sql語句。

類似於Java 的switch 語句,choose為switch,when為case,otherwise則為default。if是與(and)的關係,而choose是或(or

的關係。

<choose>  
 <when test="startTime != null and startTime != '' and endTime != null and endTime != ''">  
    and time between #{startTime} AND #{endTime}  
 </when>  
 <otherwise></otherwise>  
</choose>
5、trim標籤

trim標籤是靈活的去處多餘關鍵字的標籤。

標籤屬性
  prefix:字首覆蓋並增加其內容
  suffix:字尾覆蓋並增加其內容
  prefixOverrides:字首判斷的條件
  suffixOverrides:字尾判斷的條件