`
yjhexy
  • 浏览: 331094 次
  • 性别: Icon_minigender_1
  • 来自: 火星
社区版块
存档分类
最新评论

IBATIS 动态查询 学习

阅读更多

 

BATIS动态查询的实现主要是在iBATIS中使用安全的拼接语句,动态查询

  iBATIS比JDBC的优势之一,安全高效

 

动态查询的标签,可以在 DTD文档 http://ibatis.apache.org/dtd/sql-map-2.dtd 中找到如下:

<!ELEMENT sql (#PCDATA | include | dynamic | iterate | isParameterPresent | isNotParameterPresent | isEmpty | isNotEmpty | isNotNull | isNull | isNotEqual | isEqual | isGreaterThan | isGreaterEqual | isLessThan | isLessEqual | isPropertyAvailable | isNotPropertyAvailable)*>

 

 

 对应到 iBATIS动态查询几个常用属性

  ﹤ isPropertyAvailable ﹥  属性是存在

  ﹤ isNotPropertyAvailable ﹥  属性不存在

  ﹤ isNull ﹥  属性值是null

  ﹤ isEmpty ﹥  判断Collection.size ﹤ 1 或String.length()﹤1

  ﹤isEqual ﹥  等于

  ﹤ isNotEqual ﹥  不等于

  ﹤ isGreaterThan ﹥  大于

  ﹤ isGreaterEqual ﹥  大于等于

  ﹤ isLessThan ﹥  小于

  ﹤ isLessEqual ﹥  小于等于

 

那么这么多标签如何使用可以参考源代码,每一个标签都有一个类相对应,类图如下:

 


 

 

稍微讲解下:

首先看最上面的接口:

SqlTagHandler 包含了三个方法:

 // 一段标签开始的时候做的事情
 public int doStartFragment(SqlTagContext ctx, SqlTag tag, Object parameterObject);

// 一段标签结束的时候做的事情
  public int doEndFragment(SqlTagContext ctx, SqlTag tag, Object parameterObject, StringBuffer bodyContent);

// 追加到SQL语句 
  public void doPrepend(SqlTagContext ctx, SqlTag tag, Object parameterObject, StringBuffer bodyContent);

 

那么在这里我们主要关注实现类:

 

ConditionalTagHandler 在doStartFragment的时候调用了方法

public abstract boolean isCondition(SqlTagContext ctx, SqlTag tag, Object parameterObject);

 这个方法在各个动态查询的子类实现。方法如果返回true那么此标签内的内容将被追加。

 

到这里其实如果你想了解所有的动态查询到底怎么用,看下各个子类就都知道了。

 


===============================================

 

我将补充讲下:IsPropertyAvailableTagHandler 这个用法

 

我也将源代码贴出来如下:

package com.ibatis.sqlmap.engine.mapping.sql.dynamic.elements;

import com.ibatis.common.beans.Probe;

import com.ibatis.common.beans.ProbeFactory;

import java.util.Map;

public class IsPropertyAvailableTagHandler extends ConditionalTagHandler {

 private static final Probe PROBE = ProbeFactory.getProbe();

public boolean isCondition(SqlTagContext ctx, SqlTag tag, Object parameterObject) {

    if (parameterObject == null) {

      return false;

    } else if (parameterObject instanceof Map) {

      return ((Map)parameterObject).containsKey(tag.getPropertyAttr());      

    } else {

      String property = getResolvedProperty(ctx, tag);

      // if this is a compound property, then we need to get the next to the last

      // value from the parameter object, and then see if there is a readable property

      // for the last value.  This logic was added for IBATIS-281 and IBATIS-293

      int lastIndex = property.lastIndexOf('.');

      if (lastIndex != -1) {

        String firstPart = property.substring(0, lastIndex);

        String lastPart = property.substring(lastIndex + 1);

        parameterObject = PROBE.getObject(parameterObject, firstPart);

        property = lastPart;

      }

      

      if (parameterObject instanceof Map) {

        // we do this because the PROBE always returns true for 

        // properties in Maps and that's not the behavior we want here

        return ((Map) parameterObject).containsKey(property);

      } else {

        return PROBE.hasReadableProperty(parameterObject, property);

      }
    }
  }
}

 

 

如代码所示他有三种用法:

1,当参数是null的时候,将返回false,SQL不被追加

2,当参数是Map的时候,将比对property是否是map中的一个key。如果是,那么追加SQL(是我们比较常用的)

3,当参数是复杂类型的时候,将比对property在这个复杂类型的类中是否存在,并且是可读的,如果是,那么追加SQL

 

 

  • 大小: 23.4 KB
分享到:
评论
1 楼 jc_dreaming 2010-04-16  

相关推荐

    iBatis条件查询

    在描述中提到的"按条件查询",就是通过iBatis动态构建SQL语句来实现的。开发者可以在SQL Map中定义一个模板SQL,然后在Java代码中传入参数,iBatis会自动替换SQL中的占位符,生成实际的查询语句。这种方式既避免了硬...

    ibatis学习资料汇总

    1. 动态SQL:iBatis支持在XML映射文件中编写动态SQL,可以根据条件动态生成SQL语句,极大地增强了SQL的灵活性。 2. 参数映射:通过参数映射,iBatis可以自动将Java对象的属性值映射到SQL语句的参数,反之亦然,返回...

    ibatis学习

    6. **缓存机制**:Ibatis提供了一级缓存和二级缓存,可以优化查询性能,减少对数据库的访问。 7. **事务管理**:Ibatis支持编程式和声明式事务管理,可以根据应用场景选择合适的方式。 8. **插件扩展**:Ibatis...

    ibatis学习完整实例,例子

    此外,Ibatis的动态SQL功能使得在不写大量Java代码的情况下,可以灵活构建复杂的查询条件。比如,使用、、、等标签,可以根据条件动态生成SQL语句。在"ibatistest2"的示例中,这些动态SQL的运用无疑增加了教程的实用...

    Ibatis.net学习和实例~

    5. **动态SQL**:Ibatis.net允许你在SQL映射文件中编写动态SQL,根据条件改变查询的结构,这在处理复杂的查询需求时非常有用。 接下来,我们关注"Ibatis.net实例"。通过提供的文件《IBatisNet开发使用小结.docx》和...

    iBATIS2.0学习总结

    iBATIS提供了强大的动态SQL功能,允许在XML中使用条件判断、循环等逻辑,使得SQL语句更加灵活。 在实际项目中,结合Spring2.5的MVC框架,iBATIS可以作为一个服务层的组件,通过Spring的AOP(面向切面编程)和依赖...

    ibatis.rar学习手册

    4. **动态SQL**:iBatis的动态SQL功能强大,可以实现条件查询、循环拼接SQL等复杂操作,避免了大量的字符串拼接。 5. **事务管理**:讲解如何在iBatis中进行事务控制,包括手动和自动提交、回滚以及事务隔离级别等...

    Ibatis开发人员学习资料

    在提供的文件“ibatis 开发指南.pdf”中,读者可以深入学习到Ibatis的安装步骤、基本使用方法、动态SQL的编写、缓存机制、以及如何进行关联查询和一对一、一对多的映射。这些内容对于理解和掌握Ibatis的开发至关重要...

    ibatis学习总结,oracle , 敏捷开发,

    此外,Ibatis的动态SQL功能使你能根据不同的条件灵活构建查询,这在处理大数据量时尤其有用。 接下来,我们来讨论Oracle数据库。Oracle是世界上最广泛使用的商业关系型数据库管理系统之一,尤其在企业级应用中。它...

    ibatis学习文档

    本文旨在深入解析iBATIS映射文件的基础概念及其重要性,为初学者构建一个清晰的学习路径。 ### iBATIS映射文件:核心中的核心 iBATIS映射文件(Data Map XML File)是iBATIS框架的灵魂所在,它允许开发者明确地...

    IBatis完成单表基本的数据库操作 模糊查询

    通过阅读博客全文,你可能会学习到更多关于如何有效地使用iBatis进行数据库操作和优化查询性能的知识。 综上所述,iBatis提供了一种简单、灵活的方式来处理数据库操作,特别是像模糊查询这样的复杂查询。通过将SQL...

    Ibatis.net学习例子以及使用教程书

    通过本教程书的学习,你将掌握Ibatis.net的基本使用方法,包括查询、插入、更新和删除数据,以及如何处理复杂的业务场景。同时,你还将了解到如何结合其他.NET技术,如Entity Framework或NHibernate,以实现更高效、...

    ibatis教程_查询指定id的单个对象

    在IT行业中,数据库操作是应用程序开发中的重要环节。Ibatis,作为一个轻量级的Java持久层框架,提供了灵活的映射机制,使得...通过学习和掌握Ibatis,你可以更高效地构建数据访问层,提升项目的可维护性和可扩展性。

    ibatis3应用实例(oracle数据库)

    本篇将深入探讨Ibatis3在Oracle数据库环境下的具体应用实例,涵盖CRUD(创建、读取、更新、删除)操作以及动态SQL的使用。 一、Ibatis3简介 Ibatis3是MyBatis的前身,它放弃了Hibernate的全对象关系映射,转而采用...

    ibatis-spring学习

    它支持动态SQL,允许我们在运行时构建复杂的查询。在iBatis中,SqlSession对象用于执行SQL,Mapper接口则作为Java代码与SQL映射文件的桥梁。 接着,我们来看Spring的角色。Spring通过其DI(Dependency Injection)...

    J2EE学习 Ibatis开发资料共享 Ibatis开发资料 Ibatis学习框架 Ibatis开发概要

    ### J2EE学习:Ibatis开发资料概要 #### 一、Ibatis简介与特点 Ibatis是一款半自动化的ORM(Object Relational Mapping)框架,它不像Hibernate等其他ORM工具那样提供完全自动化的数据库操作,而是更侧重于SQL语句...

    ibatis学习IBATIS好资料

    - **动态SQL**:学习如何在SQL映射文件中实现条件判断,构建灵活的查询语句。 - **结果映射**:理解如何将数据库查询结果自动映射到Java对象,包括一对一、一对多、多对多关系的映射。 - **参数映射**:学习如何传递...

    iBatis开发指南和一个iBatis实例

    从中,你可以学习到动态SQL的使用,这是一种强大的特性,允许你在运行时根据条件动态地构建SQL语句。此外,还有关于事务管理、缓存机制、结果映射等方面的详细讲解。 "iBatis分页"是数据库操作中常见的需求,iBatis...

    java+ibatis的自我学习编码的论坛

    本资源是一个关于自我学习Java与iBatis结合进行编码的论坛项目,旨在帮助开发者提升在这两个领域的技能。 首先,Java是一种面向对象的、跨平台的编程语言,它以其丰富的类库、强大的性能和高度的可移植性而闻名。在...

Global site tag (gtag.js) - Google Analytics