IBATIS動態SQL(轉)

  直接使用JDBC一個很是廣泛的問題就是動態SQL。使用參數值、參數自己和數據列都是動態SQL,一般是很是困難的。典型的解決辦法就是用上一堆的IF-ELSE條件語句和一連串的字符串鏈接。對於這個問題,Ibatis提供了一套標準的相對比較清晰的方法來解決一個問題,這裏有個簡單的例子:java

     <select id="getUserList" resultMap="user">web

         select * from usersql

            <isGreaterThan prepend="and" property="id" compareValue="0">性能

                   where user_id = #userId#spa

            </isGreaterThan>orm

             order by createTime desc對象

    </select>ci

     上面的例子中,根據參數bean「id」屬性的不一樣狀況,可建立兩個可能的語句。若是參數「id」大於0,將建立下面的語句:字符串

      select * from user where user_id = ?  order by createTime descget

     或者,若是「id」參數小於等於0,將建立下面的語句:       select * from user  order by createTime desc

 以上的這個例子是否能夠看出Ibatis裏提供的簡單的寫法來實現了複雜拖沓的動態SQL呢?咱們在作查詢的時候,對於同一個表,甚至能夠用來定義一個動態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

        <!-- 引入動態的查詢條件 -->

         <include refid="queryCondition"/>

          order by createTime desc

    </select>

      這個使用的話是否更加的具備公用性能,這就是Ibatis帶來的便利。

      在Ibatis中,動態的條件元素包含一下幾種:二元條件元素、一元條件元素和其餘條件元素:

      (1)、二元條件元素:將一個屬性值和靜態值或另外一個屬性值比較,若是條件爲真,元素將被包容在查詢SQL語句中。

            二元條件元素的屬性:

             perpend——可被覆蓋的SQL語句組成部分,添加在語句的前面(可選)

             property——是比較的屬性(必選)

             compareProperty——另外一個用於和前者比較的屬性(必選或選擇compareValue)

             compareValue——用於比較的值(必選或選擇compareProperty)

 <isEqual>  比較屬性值和靜態值或另外一個屬性值是否相等。
 <isNotEqual>  比較屬性值和靜態值或另外一個屬性值是否不相等。
 <isGreaterThan>  比較屬性值是否大於靜態值或另外一個屬性值。
 <isGreaterEqual>  比較屬性值是否大於等於靜態值或另外一個屬性值。
 <isLessThan>  比較屬性值是否小於靜態值或另外一個屬性值。
 <isLessEqual>

 比較屬性值是否小於等於靜態值或另外一個屬性值。

舉個小例子:

     <isLessEqual prepend=」AND」 property=」age」 compareValue=」18」>           ADOLESCENT = ‘TRUE’       </isLessEqual>

    若是大於等18歲時,則爲成年人

   (2)、一元條件元素:一元條件元素檢查屬性的狀態是否符合特定的條件。

     一元條件元素的屬性:

      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:這些元素檢查參數對象是否存在

         Parameter Present條件的屬性

        prepend - 可被覆蓋的SQL語句組成部分,添加在語句的前面(可選)

 <isParameterPresent>  檢查是否存在參數對象(不爲null)
 <isNotParameterPresent>  例子: <isNotParameterPresent prepend=」AND」> EMPLOYEE_TYPE = ‘DEFAULT’ </isNotParameterPresent>

    (b)、Iterate:這屬性遍歷整個集合,併爲List集合中的元素重複元素體的內容。

          Iterate的屬性:

          prepend - 可被覆蓋的SQL語句組成部分,添加在語句的前面(可選)           property - 類型爲java.util.List的用於遍歷的元素(必選)           open - 整個遍歷內容體開始的字符串,用於定義括號(可選)           close -整個遍歷內容體結束的字符串,用於定義括號(可選)           conjunction - 每次遍歷內容之間的字符串,用於定義AND或OR(可選)

 <iterate> 遍歷類型爲java.util.List的元素。 例子: <iterate prepend="AND"  property="userNameList" open="(" close=")" conjunction="OR"> username=#userNameList[]# </iterate> 注意:使用<iterate>時,在List元素名後面包括方括號[]很是重要,方括號[]將對象標記爲List,以防解析器簡單地將List輸出成String。 

     以上講述了關於Ibatis的動態SQL的功能,是否以爲很是強大,而且優雅呢?那還猶豫什麼呢?行動起來。

相關文章
相關標籤/搜索