iBatis标签

1、动态SQL片段

通过SQL片段达到代码复用

复制代码

select count(*)


select *


from icp


name like ‘% n a m e name name%’


path like ‘%path$%’


area_id = #area_id#


hided = #hided#





limit #_start#, #_size#











复制代码
2、数字范围查询
所传参数名称是捏造所得,非数据库字段,比如_img_size_ge、_img_size_lt字段

复制代码

<![CDATA[ img_size >= #_img_size_ge# ]]>


<![CDATA[ img_size < #_img_size_lt# ]]>

复制代码

多次使用一个参数也是允许的

复制代码

<![CDATA[ execplantime >= #_now# ]]>


<![CDATA[ closeplantime <= #_now# ]]>

复制代码

3、时间范围查询

复制代码


<![CDATA[ createtime >= #_starttime# and createtime < #_endtime# ]]>


复制代码

4、in查询

      <isNotEmpty prepend="and" property="_in_state"> 
                            state in ('$_in_state$') 
                    </isNotEmpty>

5、like查询
复制代码

(chnameone like ‘% c h n a m e o n e chnameone chnameone%’ or spellinitial like ‘% c h n a m e o n e chnameone chnameone%’)


chnametwo like ‘% c h n a m e t w o chnametwo chnametwo%’

复制代码

6、or条件

复制代码

<![CDATA[ (t.finished='11' or t.failure=3) ]]>

                    <isEqual prepend="and" property="_exeable" compareValue="Y"> 
                            <![CDATA[ 
                            t.finished in ('10','19') and t.failure<3 
                    ]]> 
                    </isEqual>

复制代码

7、where子查询

复制代码



code not in
(select t.contentcode
from cms_ccm_programcontent t
where t.contenttype=‘MZNRLX_MA’
and t.programcode = #exprogramcode#)


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

复制代码

原文:http://zhaohe162.blog.163.com/blog/static/3821679720115275181509/

  直接使用JDBC一个非常普遍的问题就是动态SQL。使用参数值、参数本身和数据列都是动态SQL,通常是非常困难的。典型的解决办法就是用上一堆的IF-ELSE条件语句和一连串的字符串连接。对于这个问题,Ibatis提供了一套标准的相对比较清晰的方法来解决一个问题,这里有个简单的例子:

复制代码

     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,做到重用的地步,还是上面那个例子:

复制代码

 <dynamic prepend="WHERE">

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

               where user_id = #userId#

        </isGreaterThan>
     select * from user

    <!-- 引入动态的查询条件 -->

     <include refid="queryCondition"/>

      order by createTime desc

</select>

复制代码

  这个使用的话是否更加的具有公用性能,这就是Ibatis带来的便利。

  在Ibatis中,动态的条件元素包含一下几种:二元条件元素、一元条件元素和其他条件元素:

  (1)、二元条件元素:将一个属性值和静态值或另一个属性值比较,如果条件为真,元素将被包容在查询SQL语句中。

        二元条件元素的属性:

         perpend——可被覆盖的SQL语句组成部分,添加在语句的前面(可选)

         property——是比较的属性(必选)

         compareProperty——另一个用于和前者比较的属性(必选或选择compareValue)

         compareValue——用于比较的值(必选或选择compareProperty)

比较属性值和静态值或另一个属性值是否相等。
比较属性值和静态值或另一个属性值是否不相等。
比较属性值是否大于静态值或另一个属性值。
比较属性值是否大于等于静态值或另一个属性值。
比较属性值是否小于静态值或另一个属性值。

比较属性值是否小于等于静态值或另一个属性值。

举个小例子:

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

如果大于等18岁时,则为成年人

(2)、一元条件元素:一元条件元素检查属性的状态是否符合特定的条件。

 一元条件元素的属性:

  prepend——可被覆盖的SQL语句组成部分,添加在语句前面(可选)

  property——被比较的属性(必选)

检查是否存在该属性(存在parameter bean的属性)
检查是否不存在该属性(不存在parameter bean的属性)
检查属性是否为null
检查属性是否不为null
检查Collection.size()的值,属性的String或String.valueOf()值,是否为null或空(“”或size() < 1)
检查Collection.size()的值,属性的String或String.valueOf()值,是否不为null或不为空(“”或size() > 0)
小例子:

<isNotEmpty prepend="AND" property="firstName" >
       FIRST_NAME=#firstName#

(3)、其他元素条件

     (a).Parameter Present:这些元素检查参数对象是否存在

     Parameter Present条件的属性

    prepend - 可被覆盖的SQL语句组成部分,添加在语句的前面(可选)

检查是否存在参数对象(不为null)
例子:

EMPLOYEE_TYPE = ‘DEFAULT’

(b)、Iterate:这属性遍历整个集合,并为List集合中的元素重复元素体的内容。

      Iterate的属性:

      prepend - 可被覆盖的SQL语句组成部分,添加在语句的前面(可选)
      property - 类型为java.util.List的用于遍历的元素(必选)
      open - 整个遍历内容体开始的字符串,用于定义括号(可选)
      close -整个遍历内容体结束的字符串,用于定义括号(可选)
      conjunction - 每次遍历内容之间的字符串,用于定义AND或OR(可选)

遍历类型为java.util.List的元素。
例子:

username=#userNameList[]#

注意:使用时,在List元素名后面包括方括号[]非常重要,方括号[]将对象标记为List,以防解析器简单地将List输出成String。
以上讲述了关于Ibatis的动态SQL的功能,是否觉得非常强大,并且优雅呢?那还犹豫什么呢?行动起来。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值