• 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

  • 相关阅读:
    1. while循环(当循环) 2. do{}while()循环 3. switch cose(多选一) 例子:当选循环下求百鸡百钱 用 switch cose人机剪刀石头布
    JS。 问题类型:穷举,迭代。两个关键词:break和continue
    for循环计算游戏通关分数
    36抽8 模拟抽奖
    冒泡排序
    折纸---珠穆朗玛问题----简单for 循环
    水仙花数------"水仙花数 "是指一个三位数,其各位数字立方和等于该数本身。(for循环的嵌套)
    九九乘法表---for循环的嵌套
    百鸡百钱===百马百担====for循环嵌套
    控制台输入年龄,根据年龄输出不同的提示 ------if……else if ……else 语句
  • 原文地址:https://www.cnblogs.com/vaer/p/4338033.html
Copyright © 2020-2023  润新知