zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    【转】 java中Class对象详解和类名.class, class.forName(), getClass()区别
    106. Construct Binary Tree from Inorder and Postorder Traversal
    105. Construct Binary Tree from Preorder and Inorder Traversal
    107. Binary Tree Level Order Traversal II
    109. Convert Sorted List to Binary Search Tree
    108. Convert Sorted Array to Binary Search Tree
    110. Balanced Binary Tree
    STL容器迭代器失效问题讨论
    113. Path Sum II
    112. Path Sum
  • 原文地址:https://www.cnblogs.com/cxy2020/p/13127241.html
Copyright © 2011-2022 走看看