天天看點

轉:ibatis動态sql

直接使用jdbc一個非常普遍的問題就是動态sql。使用參數值、參數本身和資料列都是動态sql,通常是非常困難的。典型的解決辦法就是用上一堆的if-else條件語句和一連串的字元串連接配接。對于這個問題,ibatis提供了一套标準的相對比較清晰的方法來解決一個問題,這裡有個簡單的例子:

     <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>

     上面的例子中,根據參數bean“id”屬性的不同情況,可建立兩個可能的語句。如果參數“id”大于0,将建立下面的語句:

      select * from user where user_id = ?  order by createtime desc

     或者,如果“id”參數小于等于0,将建立下面的語句:

      select * from user  order by createtime desc

 以上的這個例子是否可以看出ibatis裡提供的簡單的寫法來實作了複雜拖沓的動态sql呢?我們在做查詢的時候,對于同一個表,甚至可以用來定義一個動态sql,做到重用的地步,還是上面那個例子:

<sql id="querycondition">

     <dynamic prepend="where">

   </dynamic>

</sql>

<select id="getuserlist" resultmap="user">

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

         <include refid="querycondition"/>

          order by createtime desc

      這個使用的話是否更加的具有公用性能,這就是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的功能,是否覺得非常強大,并且優雅呢?那還猶豫什麼呢?行動起來。