转: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的功能,是否觉得非常强大,并且优雅呢?那还犹豫什么呢?行动起来。

时间: 2024-10-09 18:26:52

转:ibatis动态sql的相关文章

模仿ibatis动态sql时,对于命名sql配置文件更改后,怎么及时知道或者监控配置文件发生变化,从而刷新我的缓存

问题描述 如果题目描述的不清楚可以看看我的思路,或者给我提一下建议,小弟不胜感激对ibatis不是很了解由于团队人员基础比较差想做一个类似ibatis的动态sql来查询结果集只用配置相应的sql,返回自己想要的结果集就OK了.此时遇到一个问题:开发时,比如说有不同的人员写了很多个配置文件,此时我是把配置文件在容器启动时,一起读到我的缓存中的.程序运行时,从缓存中拿数据.这就导致了一个问题,如果在容器启动时,更改并保存文件,这时候文件发生变化了,我此时我缓存还是拿的之前的数据.现在的解决办法是,每

ibatis动态语句中的prepend

关于ibatis动态sql的prepend的属性,我们需要理解一下几点 select * from student <dynamic prepend="where">  <isNotNull property="id" prepend="and">   id = #id#  </isNotNull>  <isNotNull property="name" prepend="a

Spring+Mybatis实现动态SQL查询

在报表类应用中,通常需要根据不同的维度去组合复杂的查询条件,然后构造SQL去执行查询.如果只是通过在程序中简单地拼接SQL语句,工作量会非常大,而且代码可能也非常难以维护.Mybatis支持动态SQL查询功能,可以通过配置动态的SQL来简化程序代码中复杂性,不过,这个颇有点XML编程的韵味,通过XML来处理复杂的数据判断.循环的功能,其实也很好理解. 准备工作 下面,我们首先创建一个MySQL示例表,如下所示: 01 CREATE TABLE `traffic_info` ( 02 `id` i

关于mybatis的动态sql问题

问题描述 关于mybatis的动态sql问题 就是在mybatis中我想写一条sql查询两种列表 想通过参数控制,想问一下查询的字段可不可以通过前台传入的参数进行if标签判断如: select <if test=""timeState !=null and timeState='month'""> to_char(trunc(co.CREATE_TIME)'yyyy-mm-dd') as createTime <if test="&quo

mybatis中动态sql常用的标签

用来循环容器的标签forEach,查看例子 //mapper中我们要为这个方法传递的是一个容器,将容器中的元素一个一个的 //拼接到xml的方法中就要使用这个forEach这个标签了 public List<Entity> queryById(List<String> userids); //对应的xml中如下 <select id="queryById" resultMap="BaseReslutMap" > select *

select-ibatis查出mysql数据库表中某字段为null的数据???怎么写动态sql

问题描述 ibatis查出mysql数据库表中某字段为null的数据???怎么写动态sql 例如 select * from test where name is null 这条sql 中 IS NULL 报错,不知道ibatis里该怎么写??? 解决方案 我竟然不知道你想表达什么 解决方案二: 这条sql报错,不知道怎么改进??? 解决方案三: select * from table where content is "" 解决方案四: 在数据库中null 也是个值 解决方案五: 我

《Mybatis官方文档》 – 动态 SQL

动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦.拼接的时候要确保不能忘了必要的空格,还要注意省掉一连串列名最后的逗号.利用动态 SQL 这一特性可以彻底摆脱这种痛苦. 通常使用动态 SQL 不可能是独立的一部分,MyBatis 通过一种强大的动态 SQL 语言明显地改进了这种情形,这种语言可以被用在任意的 SQL 映射语句中. 动态 SQL 元素和使用 JSTL 或其他类似基于

三、动态SQL语句

 三.动态SQL语句 2013-09-06 17:06:55 标签:Oracle 配置文件 sql语句 insert mysql语法 MyBatis学习 之 一.MyBatis简介与配置MyBatis+Spring+MySql MyBatis学习 之 二.SQL语句映射文件(1)resultMap MyBatis学习 之 二.SQL语句映射文件(2)增删改查.参数.缓存 MyBatis学习 之 三.动态SQL语句 MyBatis学习 之 四.MyBatis配置文件       有些时候,sql语

MyBatis实践之动态SQL及关联查询_MsSql

序言 MyBatis,大家都知道,半自动的ORM框架,原来叫ibatis,后来好像是10年apache软件基金组织把它托管给了goole code,就重新命名了MyBatis,功能相对以前更强大了.它相对全自动的持久层框架Hibernate,更加灵活,更轻量级,这点我还是深有体会的. MyBatis的一个强大特性之一就是动态SQL能力了,能省去我们很多串联判断拼接SQL的痛苦,根据项目而定,在一定的场合下使用,能大大减少程序的代码量和复杂程度,不过还是不是过度太过复杂的使用,以免不利于后期的维护