MyBatis动态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"> 

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值