`
wanxiaotao12
  • 浏览: 477207 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ibatis 动态映射多条件查询-动态sql语句

 
阅读更多

动态Mapped Statement


直接使用JDBC一个非常普遍的问题是动态SQL。使用参数值、参数本身和数据列都是动态的SQL,通常非常困难。典型的解决方法是,使用一系列if-else条件语句和一连串讨厌的字符串连接。对于这个问题,SQL Map API使用和mapped statement非常相似的结构,提供了较为优雅的方法。

一个简单的例子:

 

<select id="dynamicGetAccountList" cacheModel="account-cache" resultMap="account-result" > 
   select * from ACCOUNT 
   <isGreaterThan prepend="and" property="id" compareValue="0"> 
     where ACC_ID = #id# 
   </isGreaterThan> 
   order by ACC_LAST_NAME 
</select>

  

上面的例子中,根据参数bean"id"属性的不同情况,可创建两个可能的语句。
如果参数"id"大于0,将创建下面的语句:
   select * from ACCOUNT where ACC_ID = ?

或者,如果“id”参数小于等于0,将创建下面的语句:
   select * from ACCOUNT

 

在更复杂的例子中,动态Mapped Statement的用处更明显。如下面比较复杂的例子:

 

<statement id="dynamicGetAccountList" resultMap="account-result" > 
   select * from ACCOUNT 
   <dynamic prepend="WHERE"> 
      <isNotNull prepend="AND" property="firstName"> 
         (ACC_FIRST_NAME = #firstName# 
            <isNotNull prepend="OR" property="lastName"> 
               ACC_LAST_NAME = #lastName# 
            </isNotNull> 
         ) 
      </isNotNull> 
      <isNotNull prepend="AND" property="emailAddress"> 
         ACC_EMAIL like #emailAddress# 
      </isNotNull> 
      <isGreaterThan prepend="AND" property="id" compareValue="0"> 
         ACC_ID = #id# 
      </isGreaterThan> 
   </dynamic> 
order by ACC_LAST_NAME
</ statement >

 
根据不同的条件,上面动态的语句可以产生16条不同的查询语句。使用if-else结构和字符串,会产生上百行很乱的代码。

而使用动态Statement,和在SQL的动态部位周围插入条件标签一样容易。例如:

<statement id="someName" resultMap="account-result" > 
   select * from ACCOUNT 
      <dynamic prepend="where"> 
         <isGreaterThan prepend="and" property="id" compareValue="0"> 
            ACC_ID = #id# 
         </isGreaterThan> 
         <isNotNull prepend=”and" property="lastName"> 
            ACC_LAST_NAME = #lastName# 
         </isNotNull> 
      </dynamic> 
      order by ACC_LAST_NAME 
</statement> 

 

 上面的例子中,<dynamic>元素划分出SQL语句的动态部分。动态部分可以包含任意多的条件标签元素,条件标签决定是否在语句中包含其中的SQL代码。所有的条件标签元素将根据传给动态查询Statement的参数对象的情况来工作。<dynamic>元素和条件元素都有“prepend”属性,它是动态SQL代码的一部分,在必要情况下,可以被父元素的“prepend”属性覆盖。上面的例子中,prepend属性“where”将覆盖第一个为“真”的条件元素。这对于确保生成正确的SQL语句是有必要的。例如,在第一个为“真”的条件元素中,“AND”是不需要的,事实上,加上它肯定会出错。

 

二元条件元素

二元条件元素将一个属性值和一个静态值或另一个属性值比较,如果条件为“真”,元素体的内容将被包括在查询SQL语句中。

二元条件元素的属性:
prepend:可被覆盖的SQL语句组成部分,添加在语句的前面(可选)
property:被比较的属性(必选)
compareProperty:另一个用于和前者比较的属性(必选或选择compareValue)
compareValue:用于比较的值(必选或选择compareProperty)

比较关键字
<isEqual>:比较属性值和静态值或另一个属性值是否相等。
<isNotEqual>:比较属性值和静态值或另一个属性值是否不相等。
<isGreaterThan>:比较属性值是否大于静态值或另一个属性值。
<isGreaterEqual>:比较属性值是否大于等于静态值或另一个属性值。
<isLessThan>:比较属性值是否小于静态值或另一个属性值。
<isLessEqual>:比较属性值是否小于等于静态值或另一个属性值。
例子:
<isLessEqual prepend=”AND” property=”age” compareValue=”18”>
ADOLESCENT = ‘TRUE’
</isLessEqual>

 

一元条件元素


一元条件元素检查属性的状态是否符合特定的条件。
一元条件元素的属性:
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>

分享到:
评论

相关推荐

    iBATIS-SqlMaps-2-Tutorial_cn

    动态SQL是iBATIS的一大特色,它允许在SQL语句中使用条件判断、循环等逻辑,极大地增强了SQL的灵活性。 本书首先会引导读者理解iBATIS的基本架构,然后详细介绍如何创建和配置SqlMap,以及如何编写映射文件。映射...

    iBATIS-SqlMaps-2-快速入门教程.docx

    它提供了一种灵活的方式来映射 Java 对象到数据库表,允许开发者使用 SQL 语句来操作数据库。 知识点2:SQL Map 架构 SQL Map 架构是 iBATIS-SqlMaps-2 的核心组件,负责将 Java 对象映射到数据库表。 SQL Map ...

    iBATIS-SqlMaps-2-Tutorial_en.rar

    SqlMaps是iBATIS的核心组件,用于定义SQL映射文件,将Java代码与SQL语句分离,提高了代码的可读性和可维护性。这个"iBATIS-SqlMaps-2-Tutorial_en.rar"文件是一个英文教程,旨在帮助开发者深入了解和使用iBATIS Sql...

    iBatis的动态SQL语句

    iBatis框架中的动态SQL主要通过XML映射文件来实现,它允许在映射文件中使用各种标签来控制SQL语句的生成过程。这些标签包括但不限于`&lt;if&gt;`、`&lt;choose&gt;`、`&lt;when&gt;`、`&lt;otherwise&gt;`、`&lt;trim&gt;`、`&lt;where&gt;`、`&lt;set&gt;`、`...

    iBATIS-SqlMaps,ibatis映射文件

    例如,元素用于定义一个查询,它可以包含静态SQL语句,也可以使用动态SQL来适应不同条件的查询。元素用来执行插入操作,用于更新,而用于删除。在这些元素中,你可以通过来定义输入参数,通过来定义结果集的映射规则...

    iBATIS-SqlMaps-2-Tutorial

    iBATIS-SqlMaps允许开发者直接编写SQL语句,这意味着可以利用SQL的强大功能来处理复杂的查询需求,同时也提供了更少的限制,例如表每类、多表每类或多类每表等关系。 ### 三、准备使用SQLMaps 在开始使用SQLMaps...

    iBATIS-SqlMaps-2_cn.pdf

    6. **Dynamic SQL**:允许在XML映射文件中进行条件判断,动态生成SQL语句,提高了SQL的灵活性和复用性。 7. **Transactions**:SQL Maps支持声明式和编程式的事务管理,确保数据的一致性和完整性。 通过使用iBATIS...

    iBATIS-SqlMaps-2-Tutorial_en.pdf

    - **动态SQL**:支持根据条件构建SQL语句,例如使用`&lt;if&gt;`、`&lt;choose&gt;`等标签来控制SQL的动态生成。 - **分页查询**:提供分页功能的支持,便于处理大量数据时的分批加载。 - **缓存机制**:内置二级缓存机制,提高...

    ibatis-sqlmaps-2_cn

    此外,教程还会涵盖动态SQL,这是IBATIS的一大亮点,允许在运行时构建和修改SQL语句,提高了代码的复用性和可维护性。 在使用IBATIS的过程中,你可能会遇到参数映射和结果映射的问题。《ibatis-sqlmaps-2_cn》将...

    ibatis 开发指南 和 iBATIS-SqlMaps两本图书

    5. **动态SQL**:讲解如何使用iBATIS的动态元素来构建灵活的SQL语句,以应对复杂的查询需求。 6. **API使用**:介绍SqlSession、SqlSessionFactory、Executor等关键接口和类的使用方法。 7. **缓存机制**:解释...

    iBATIS-SqlMaps-2_ja.pdf

    iBATIS 支持动态 SQL,即根据运行时的条件动态构建 SQL 语句。这包括: - **二进制条件元素**:例如 `&lt;if&gt;` 和 `&lt;choose&gt;` 等元素,用于构建复杂的条件逻辑。 - **简单动态 SQL 元素**:如 `&lt;where&gt;` 和 `&lt;set&gt;` 等...

    ibatis常用sql语句

    标题与描述概述的知识点主要集中在iBATIS框架的SQL映射技术上,特别是针对不同类型的输入参数如何在iBATIS中构建SQL语句。以下是对这些知识点的详细展开: ### iBATIS SQL映射技术概览 iBATIS是早期流行的Java持久...

    ibatis-SqlMaps-开发指南-version 1.0 及 ibatis-SqlMaps-开发指南-version 2

    4. **动态SQL**:展示了如何使用iBATIS的动态SQL特性,通过`&lt;if&gt;`、`&lt;choose&gt;`、`&lt;when&gt;`、`&lt;otherwise&gt;`等标签来编写灵活的查询条件。 5. **结果映射**:介绍了如何映射SQL查询结果到Java对象,包括基本类型、复杂...

    iBATIS-SqlMaps-2 PDF文档资料(日文)

    iBATIS的核心概念是SqlMap,它是一种XML配置文件,用于定义SQL语句和映射结果集到Java对象。SqlMap中的每个元素都代表一个数据库查询或更新操作,可以通过ID进行引用。这些SQL语句可以在不修改源代码的情况下进行...

    iBATIS-DAO-2.3.4.726.rar_com.ibatis.dao_iBATIS dao 2_iBatis DAO_

    此外,iBATIS还提供了一些辅助工具,如`ParameterMap`用于管理SQL语句的输入参数,`ResultMap`用于处理查询结果的映射,以及`Cache`机制,用于缓存查询结果,提高系统性能。这些工具类使得开发者能够更方便地进行...

    动态ibatis查询语句配置

    动态查询语句配置是Ibatis的一个重要特性,它允许我们在运行时根据业务需求构建灵活多变的SQL语句。这篇博文主要探讨的是如何在Ibatis中设置和使用动态SQL,以便实现更高效、更灵活的数据查询。 首先,我们需要理解...

    iBATIS-SqlMaps-中文教程

    5. **动态SQL**:iBATIS的一大亮点是其强大的动态SQL能力,可以实现条件查询、循环拼接SQL等复杂逻辑,无需编写大量Java代码。 6. **Mapper接口**:iBATIS 2.3版本引入了Mapper接口,将XML配置与Java代码更好地结合...

    iBATIS-SqlMaps2入门代码文档

    - `&lt;sqlMap&gt;`元素指定外部映射文件的位置,用于定义具体的SQL语句和映射规则。 #### 四、总结 本文档为初学者提供了iBATIS-SqlMaps2的基础知识和实践指导。通过本文档的学习,你可以掌握如何使用iBATIS-SqlMaps2来...

Global site tag (gtag.js) - Google Analytics