转:IBATIS动态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。 

以上讲述了关于Ibatis的动态SQL的功能,是否觉得非常强大,并且优雅呢?那还犹豫什么呢?行动起来。

IBATIS动态SQL(1)的更多相关文章

  1. 转:ibatis动态sql

    转:ibatis动态sql 直接使用JDBC一个非常普遍的问题就是动态SQL.使用参数值.参数本身和数据列都是动态SQL,通常是非常困难的.典型的解决办法就是用上一堆的 IF-ELSE条件语句和一连串 ...

  2. ibatis动态sql配置启动时提示:The content of elements must consist of well-formed character data...

    ibatis动态sql配置启动时提示:The content of elements must consist of well-formed character data... 2012-07-18 ...

  3. 值得注意的ibatis动态sql语法格式

    一.Ibatis常用动态sql语法,简单粗暴用一例子 <select id="iBatisSelectList" parameterClass="java.util ...

  4. IBATIS动态SQL(转)

    直接使用JDBC一个非常普遍的问题就是动态SQL.使用参数值.参数本身和数据列都是动态SQL,通常是非常困难的.典型的解决办法就是用上一堆的IF-ELSE条件语句和一连串的字符串连接.对于这个问题,I ...

  5. IBATIS动态SQL

    转自:http://www.cnblogs.com/phoebus0501/archive/2011/05/16/2048126.html 直接使用JDBC一个非常普遍的问题就是动态SQL.使用参数值 ...

  6. ibatis 动态SQL

    直接使用JDBC一个非常普遍的问题就是动态SQL.使用参数值.参数本身和数据列都是动态SQL,通常是非常困难的.典型的解决办法就是用上一堆的IF-ELSE条件语句和一连串的字符串连接.对于这个问题,I ...

  7. Ibatis动态拼装sql,常用标签总结及举栗子。

    今天得到项目经理一项任务,就是拼装sql,第一次见到,不是太懂,赶紧回来睡一觉再说,由于这次的项目orm使用的是ibatis框架,所以需要使用动态拼装sql,或者是ognl语言,这门语言不是专属于ib ...

  8. IBatis.net动态SQL语句

    在学习动态SQL语句之前,首先必须对条件查询有一定了解,先来学习如何向IBatis.Net的映射文件里传入参数. 一.条件查询 1.传递单个参数 如根据Id查询: <select id=&quo ...

  9. IBatis.net动态SQL语句(六)

    在学习动态SQL语句之前,首先必须对条件查询有一定了解,先来学习如何向IBatis.Net的映射文件里传入参数. 一.条件查询 1.传递单个参数 如根据Id查询: <select id=&quo ...

随机推荐

  1. 链表插入和删除,判断链表是否为空,求链表长度算法的,链表排序算法演示——C语言描述

    关于数据结构等的学习,以及学习算法的感想感悟,听了郝斌老师的数据结构课程,其中他也提到了学习数据结构的或者算法的一些个人见解,我觉的很好,对我的帮助也是很大,算法本就是令人头疼的问题,因为自己并没有学 ...

  2. eclipse在线安装s

    1. 打开eclipse软件,点击菜单栏的help-->Install New Software 2. 在弹出来的安装窗口中,点击add按钮,然后输入svn安装地址:http://subclip ...

  3. Ubuntu常用软件包管理命令

      1.查看软件包xxx安装内容 #dpkg -L xxx  例子: #dpkg -L binutils    //查看安装binutils包会安装哪些文件   2.列出系统已安装的或指定deb包的安 ...

  4. 流畅的python学习笔记:第二章

    第二章开始介绍了列表这种数据结构,这个在python是经常用到的结构 列表的推导,将一个字符串编程一个列表,有下面的2种方法.其中第二种方法更简洁.可读性也比第一种要好 str='abc' strin ...

  5. Java NIO学习笔记六 SocketChannel 和 ServerSocketChannel

    Java NIO SocketChannel Java NIO SocketChannel是连接到TCP网络socket(套接字)的通道.Java NIO相当于Java Networking的sock ...

  6. win7安装oracle10g数据库 提示“…实际版本为6.1”

    1.最重要的是需要以管理员的身份操作 2.修改重要的文件 然后解压,在目录中找到refhost.xml(有两个,我的一个是在stage\prereq\db目录下,一个是在stage\prereq\db ...

  7. 将angular-ui-bootstrap的弹出框定义成一个服务的实践

    定义一个弹出框的服务:alert_boxdefiine(["app"],function(mainapp){ mainapp.controller('ModalInstanceCt ...

  8. JAVA 23种开发模式详解(代码举例)

    设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

  9. 今天学习js做了些总结,分享给大家

    一.1.javascript的作用   是基于对象和事件驱动的语言,应用于客户端   基于对象:提供好了很多对象,可以直接拿过来使用,不需要创建   事件驱动: html做网站静态效果,javascr ...

  10. 【面经】腾讯和YY实习生面试总结

    [前言] 之前的四月份和五月份各面试了腾讯和YY的暑假实习,腾讯的失败了,YY的成功了.面试中我总会遇到自己不懂的,所幸的是不懂的越来越少,自己也一步一脚印得攻克自己不懂的.此时六月份的我再回顾起来, ...