iBatis動態SQL標簽用法


1、動態SQL片段
通過SQL片段達到代碼復用
        <!--  動態條件分頁查詢 --> 
         < sql  id ="sql_count" > 
                select count(*) 
         </ sql > 
         < sql  id ="sql_select" > 
                select * 
         </ sql > 
         < sql  id ="sql_where" > 
                from icp 
                 < dynamic  prepend ="where" > 
                         < isNotEmpty  prepend ="and"  property ="name" > 
                                name like '%$name$%' 
                         </ isNotEmpty > 
                         < isNotEmpty  prepend ="and"  property ="path" > 
                                path like '%path$%' 
                         </ isNotEmpty > 
                         < isNotEmpty  prepend ="and"  property ="area_id" > 
                                area_id = #area_id# 
                         </ isNotEmpty > 
                         < isNotEmpty  prepend ="and"  property ="hided" > 
                                hided = #hided# 
                         </ isNotEmpty > 
                 </ dynamic > 
                 < dynamic prepend="" > 
                         < isNotNull  property ="_start" > 
                                 < isNotNull  property ="_size" > 
                                        limit #_start#, #_size# 
                                 </ isNotNull > 
                         </ isNotNull > 
                 </ dynamic > 
         </ sql > 
         < select  id ="findByParamsForCount"  parameterClass ="map"  resultClass ="int" > 
                 < include  refid ="sql_count" /> 
                 < include  refid ="sql_where" /> 
         </ select > 
         < select  id ="findByParams"  parameterClass ="map"  resultMap ="icp.result_base" > 
                 < include  refid ="sql_select" /> 
                 < include  refid ="sql_where" /> 
         </ select >
 
2、數字范圍查詢
所傳參數名稱是捏造所得,非數據庫字段,比如_img_size_ge、_img_size_lt字段
                         < isNotEmpty  prepend ="and"  property ="_img_size_ge" > 
                                <![CDATA[ 
                                img_size >= #_img_size_ge# 
                        ]]> 
                         </ isNotEmpty > 
                         < isNotEmpty  prepend ="and"  property ="_img_size_lt" > 
                                <![CDATA[ 
                                img_size  < #_img_size_lt# 
                        ]] > 
                         </ isNotEmpty > 
 
多次使用一個參數也是允許的
                         < isNotEmpty  prepend ="and"  property ="_now" > 
                                <![CDATA[ 
                                            execplantime >= #_now# 
                                     ]]> 
                         </ isNotEmpty > 
                         < isNotEmpty  prepend ="and"  property ="_now" > 
                                <![CDATA[ 
                                            closeplantime  < = #_now# 
                                     ]] > 
                         </ isNotEmpty >
 
3、時間范圍查詢
                         < isNotEmpty  prepend ="" property="_starttime" > 
                                 < isNotEmpty  prepend ="and"  property ="_endtime" > 
                                        <![CDATA[ 
                                        createtime >= #_starttime# 
                                        and createtime  < #_endtime# 
                                 ]] > 
                                 </ isNotEmpty > 
                         </ isNotEmpty > 
 
4、in查詢
                         < isNotEmpty  prepend ="and"  property ="_in_state" > 
                                state in ('$_in_state$') 
                         </ isNotEmpty >
 
5、like查詢
                         < isNotEmpty  prepend ="and"  property ="chnameone" > 
                                (chnameone like '%$chnameone$%' or spellinitial like '%$chnameone$%') 
                         </ isNotEmpty > 
                         < isNotEmpty  prepend ="and"  property ="chnametwo" > 
                                chnametwo like '%$chnametwo$%' 
                         </ isNotEmpty > 
 
6、or條件
                         < isEqual  prepend ="and"  property ="_exeable"  compareValue ="N" > 
                                <![CDATA[ 
                                (t.finished='11'    or t.failure=3) 
                        ]]> 
                         </ isEqual >
 
                         < isEqual  prepend ="and"  property ="_exeable"  compareValue ="Y" > 
                                <![CDATA[ 
                                t.finished in ('10','19') and t.failure < 3 
                        ]] > 
                         </ isEqual >
 
7、where子查詢
                         < isNotEmpty  prepend ="" property="exprogramcode" > 
                                 < isNotEmpty  prepend ="" property="isRational" > 
                                         < isEqual  prepend ="and"  property ="isRational"  compareValue ="N" > 
                                                code not in 
                                                (select t.contentcode 
                                                from cms_ccm_programcontent t 
                                                where t.contenttype='MZNRLX_MA' 
                                                and t.programcode = #exprogramcode#) 
                                         </ isEqual > 
                                 </ isNotEmpty > 
                         </ isNotEmpty >
 
         < select  id ="findByProgramcode"  parameterClass ="string"  resultMap ="cms_ccm_material.result" > 
                select * 
                from cms_ccm_material 
                where code in 
                (select t.contentcode 
                from cms_ccm_programcontent t 
                where t.contenttype = 'MZNRLX_MA' 
                and programcode = #value#) 
                order by updatetime desc 
         </ select >
 
9、函數的使用
        <!--  添加 --> 
         < insert  id ="insert"  parameterClass ="RuleMaster" > 
                insert into rulemaster( 
                name, 
                createtime, 
                updatetime, 
                remark 
                ) values ( 
                #name#, 
                now(), 
                now(), 
                #remark# 
                ) 
                 < selectKey  keyProperty ="id"  resultClass ="long" > 
                        select LAST_INSERT_ID() 
                 </ selectKey > 
         </ insert > 
        <!--  更新 --> 
         < update  id ="update"  parameterClass ="RuleMaster" > 
                update rulemaster set 
                name = #name#, 
                updatetime = now(), 
                remark = #remark# 
                where id = #id# 
         </ update >
 
10、map結果集
        <!--  動態條件分頁查詢 --> 
         < sql  id ="sql_count" > 
                select count(a.*) 
         </ sql > 
         < sql  id ="sql_select" > 
                select a.id                vid, 
                a.img             imgurl, 
                a.img_s         imgfile, 
                b.vfilename vfilename, 
    b.name            name, 
                c.id                sid, 
                c.url             url, 
                c.filename    filename, 
                c.status        status 
         </ sql > 
         < sql  id ="sql_where" > 
                From secfiles c, juji b, videoinfo a 
                where 
                a.id = b. videoid 
                and b.id = c.segmentid 
                and c.status = 0 
                order by a.id asc,b.id asc,c.sortnum asc 
                 < dynamic prepend="" > 
                         < isNotNull  property ="_start" > 
                                 < isNotNull  property ="_size" > 
                                        limit #_start#, #_size# 
                                 </ isNotNull > 
                         </ isNotNull > 
                 </ dynamic > 
         </ sql > 
        <!--  返回沒有下載的記錄總數 --> 
         < select  id ="getUndownFilesForCount"  parameterClass ="map"  resultClass ="int" > 
                 < include  refid ="sql_count" /> 
                 < include  refid ="sql_where" /> 
         </ select > 
        <!--  返回沒有下載的記錄 --> 
         < select  id ="getUndownFiles"  parameterClass ="map"  resultClass ="java.util.HashMap" > 
                 < include  refid ="sql_select" /> 
                 < include  refid ="sql_where" /> 
         </ select >
--------------------------------------------------------------------------------------------------------

      直接使用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">

            <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的功能,是否覺得非常強大,並且優雅呢?那還猶豫什么呢?行動起來。

原文:http://www.cnblogs.com/phoebus0501/archive/2011/05/16/2048126.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM