博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
转:ibatis动态sql
阅读量:7065 次
发布时间:2019-06-28

本文共 2908 字,大约阅读时间需要 9 分钟。


直接使用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://twsll.baihongyu.com/

你可能感兴趣的文章
hdu 1285 确定比赛名次
查看>>
Eureka微服务实战-服务提供者
查看>>
简单的原生ajax
查看>>
h5开发坑点小总结
查看>>
几分钟内提升技能的8个 JavaScript 方法!
查看>>
mac显示隐藏文件
查看>>
Android 插件化原理-好文收集(陆续中。。。)
查看>>
双亲委派模型与Tomcat类加载架构
查看>>
Highcharts tooltip显示数量和百分比
查看>>
小程序兼容iphoneX(齐刘海)代码,mpvue的写法
查看>>
小米设备怎么不ROOT激活Xposed框架的步骤
查看>>
Vue Router
查看>>
你所听到的技术原理、技术本质到底是什么?
查看>>
决战燕京城-10 前往天寿山
查看>>
WebMvcTest与SpringBootTest
查看>>
面试官:你接受免费加班吗?程序员这样怼回去,网友:老铁没毛病
查看>>
分享我的个人项目:Wildfire 野火评论系统
查看>>
【机器视觉与图像处理】基于MATLAB的角度计算
查看>>
一篇很全面的IOS面试题(下)
查看>>
极简.高性能.分布式框架,可运行于多种环境(apache/php-fpm,swoole)
查看>>