在編寫SqlMaps的時候,經常需要把一個sql拆分成多個片段。IBatis提供了一個簡單有很實用的分割節點來進行SQL的分割。舉個簡單的例子,假設需要查詢一些學生的信息。
原來的寫法是:
現在用sql標簽可以這樣寫:
<include refid ="SelectALL"/> refid:就是指要調用sql標簽的id。
sql標簽就相當於C#裡的定義一個字符串,裡面存著一些值,可以被其他標簽調用。這樣一來就可以減少重復代碼的書寫。
IBatis動態拼接sql
實例:
View Code動態標簽分類:1<dynamic>,2 二元標簽,3 一元標簽,4 <iterate>
這四種標簽以及他們的子標簽具有共同的屬性prepend,open,close。
去除第一個prepend="and"
一元條件元素的屬性:
prepend - 可被覆蓋的SQL語句組成部分,添加在語句的前面(可選)
property - 被比較的屬性(必選)
<isPropertyAvailable> 檢查是否存在該屬性(存在parameter bean的屬性)。
<isNotPropertyAvailable> 檢查是否不存在該屬性(不存在parameter bean的屬性)。
<isNull> 檢查屬性是否為null。
<isNotNull> 檢查屬性是否不為null。
<isEmpty> 檢查Collection.size()的值,屬性的String或String.valueOf()值,是否為null或空(“”或size() < 1)。
<isNotEmpty> 檢查Collection.size()的值,屬性的String或String.valueOf()值,是否不為null或不為空(“”或size() > 0)。
例子:
<isNotEmpty prepend=”AND” property=”firstName” >
FIRST_NAME=#firstName#
</isNotEmpty>
二元條件元素的屬性: 二元是兩個對象進行比較
prepend - 可被覆蓋的SQL語句組成部分,添加在語句的前面(可選)
property - 被比較的屬性(必選)
compareProperty - 另一個用於和前者比較的屬性(必選或選擇compareValue)
compareValue - 用於比較的值(必選或選擇compareProperty)
<isEqual> 比較屬性值和靜態值或另一個屬性值是否相等。
<isNotEqual> 比較屬性值和靜態值或另一個屬性值是否不相等。
<isGreaterThan> 比較屬性值是否大於靜態值或另一個屬性值。
<isGreaterEqual> 比較屬性值是否大於等於靜態值或另一個屬性值。
<isLessThan> 比較屬性值是否小於靜態值或另一個屬性值。
<isLessEqual> 比較屬性值是否小於等於靜態值或另一個屬性值。
例子:
<isLessEqual prepend=”AND” property=”age” compareValue=”18”>
ADOLESCENT = ‘TRUE’
</isLessEqual>
isPropertyAvailable的區別
這個兩個屬性非常有用
isPropertyAvailable
isNotEmpty
入參一般是一個封裝了數據的
如果希望一個屬性無論為何值都符合條件則使用
如果希望一個屬性只是不為空的時候才符合條件就用
<iterate>:這屬性遍歷整個集合,並為List集合中的元素重復元素體的內容。
Iterate的屬性:
prepend - 可被覆蓋的SQL語句組成部分,添加在語句的前面(可選)
property - 類型為java.util.List的用於遍歷的元素(必選)
open - 整個遍歷內容體開始的字符串,用於定義括號(可選)
close -整個遍歷內容體結束的字符串,用於定義括號(可選)
conjunction - 每次遍歷內容之間的字符串,用於定義AND或OR(可選)
例子:
<iterate prepend=”AND” property=”userNameList” open=”(” close=”)” conjunction=”OR”> username=#userNameList[]# </iterate> = and(username=name1 or username=name2...)
注意:使用<iterate>時,在List元素名後面包括方括號[]非常重要,方括號[]將對象標記為List,以防解析器簡單地將List輸出成String。
[color=darkred][/color]