转:ibatis动态sql
???? <select id="getUserList" resultMap="user">
???????? select * from user
??????????? <isGreaterThan prepend="and" property="id" compareValue="0">
?????????????????? where user_id = #userId#
??????????? </isGreaterThan>
?????????????order by createTime desc
??? </select>
???? 上面的例子中,根據(jù)參數(shù)bean“id”屬性的不同情況,可創(chuàng)建兩個可能的語句。如果參數(shù)“id”大于0,將創(chuàng)建下面的語句:
????? select * from user where user_id = ???order by createTime desc
???? 或者,如果“id”參數(shù)小于等于0,將創(chuàng)建下面的語句:
????? select * from user??order by createTime desc
?以上的這個例子是否可以看出Ibatis里提供的簡單的寫法來實現(xiàn)了復雜拖沓的動態(tài)SQL呢?我們在做查詢的時候,對于同一個表,甚至可以用來定義一個動態(tài)SQL,做到重用的地步,還是上面那個例子:
<sql id="queryCondition">
???? <dynamic prepend="WHERE">
??????????? <isGreaterThan prepend="and" property="id" compareValue="0">
?????????????????? where user_id = #userId#
??????????? </isGreaterThan>
?? </dynamic>
</sql>
<select id="getUserList" resultMap="user">
???????? select * from user
??????? <!--?引入動態(tài)的查詢條件 -->
???????? <include refid="queryCondition"/>
??????????order by createTime desc
??? </select>
????? 這個使用的話是否更加的具有公用性能,這就是Ibatis帶來的便利。
????? 在Ibatis中,動態(tài)的條件元素包含一下幾種:二元條件元素、一元條件元素和其他條件元素:
??????(1)、二元條件元素:將一個屬性值和靜態(tài)值或另一個屬性值比較,如果條件為真,元素將被包容在查詢SQL語句中。
??????????? 二元條件元素的屬性:
???????????? perpend——可被覆蓋的SQL語句組成部分,添加在語句的前面(可選)
???????????? property——是比較的屬性(必選)
???????????? compareProperty——另一個用于和前者比較的屬性(必選或選擇compareValue)
???????????? compareValue——用于比較的值(必選或選擇compareProperty)
| ?<isEqual> | ?比較屬性值和靜態(tài)值或另一個屬性值是否相等。 |
| ?<isNotEqual> | ?比較屬性值和靜態(tài)值或另一個屬性值是否不相等。 |
| ?<isGreaterThan> | ?比較屬性值是否大于靜態(tài)值或另一個屬性值。 |
| ?<isGreaterEqual> | ?比較屬性值是否大于等于靜態(tài)值或另一個屬性值。 |
| ?<isLessThan> | ?比較屬性值是否小于靜態(tài)值或另一個屬性值。 |
| ?<isLessEqual> | ?比較屬性值是否小于等于靜態(tài)值或另一個屬性值。 |
舉個小例子:
???? <isLessEqual prepend=”AND” property=”age” compareValue=”18”>
????????? ADOLESCENT = ‘TRUE’
??????</isLessEqual>
??? 如果大于等18歲時,則為成年人
?? (2)、一元條件元素:一元條件元素檢查屬性的狀態(tài)是否符合特定的條件。
???? 一元條件元素的屬性:
????? 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>
?? (3)、其他元素條件
???????? (a).Parameter Present:這些元素檢查參數(shù)對象是否存在
???????? Parameter Present條件的屬性
??????? prepend - 可被覆蓋的SQL語句組成部分,添加在語句的前面(可選)
| ?<isParameterPresent> | ?檢查是否存在參數(shù)對象(不為null) |
| ?<isNotParameterPresent> | ?例子: <isNotParameterPresent prepend=”AND”> EMPLOYEE_TYPE = ‘DEFAULT’ </isNotParameterPresent> |
??? (b)、Iterate:這屬性遍歷整個集合,并為List集合中的元素重復元素體的內(nèi)容。
????????? Iterate的屬性:
????????? prepend - 可被覆蓋的SQL語句組成部分,添加在語句的前面(可選)
????????? property - 類型為java.util.List的用于遍歷的元素(必選)
????????? open - 整個遍歷內(nèi)容體開始的字符串,用于定義括號(可選)
????????? close -整個遍歷內(nèi)容體結(jié)束的字符串,用于定義括號(可選)
????????? conjunction - 每次遍歷內(nèi)容之間的字符串,用于定義AND或OR(可選)
| ?<iterate> | 遍歷類型為java.util.List的元素。 例子: <iterate prepend="AND" ?property="userNameList" open="(" close=")" conjunction="OR"> username=#userNameList[]# </iterate> 注意:使用<iterate>時,在List元素名后面包括方括號[]非常重要,方括號[]將對象標記為List,以防解析器簡單地將List輸出成String。? |
???? 以上講述了關(guān)于Ibatis的動態(tài)SQL的功能,是否覺得非常強大,并且優(yōu)雅呢?那還猶豫什么呢?行動起來。
總結(jié)
以上是生活随笔為你收集整理的转:ibatis动态sql的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 旅途愉快一路顺风的意思(一路顺风的意思)
- 下一篇: Ibatis动态(dynamic)查询