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
分享到:
相关推荐
在描述中提到的"按条件查询",就是通过iBatis动态构建SQL语句来实现的。开发者可以在SQL Map中定义一个模板SQL,然后在Java代码中传入参数,iBatis会自动替换SQL中的占位符,生成实际的查询语句。这种方式既避免了硬...
1. 动态SQL:iBatis支持在XML映射文件中编写动态SQL,可以根据条件动态生成SQL语句,极大地增强了SQL的灵活性。 2. 参数映射:通过参数映射,iBatis可以自动将Java对象的属性值映射到SQL语句的参数,反之亦然,返回...
6. **缓存机制**:Ibatis提供了一级缓存和二级缓存,可以优化查询性能,减少对数据库的访问。 7. **事务管理**:Ibatis支持编程式和声明式事务管理,可以根据应用场景选择合适的方式。 8. **插件扩展**:Ibatis...
此外,Ibatis的动态SQL功能使得在不写大量Java代码的情况下,可以灵活构建复杂的查询条件。比如,使用、、、等标签,可以根据条件动态生成SQL语句。在"ibatistest2"的示例中,这些动态SQL的运用无疑增加了教程的实用...
5. **动态SQL**:Ibatis.net允许你在SQL映射文件中编写动态SQL,根据条件改变查询的结构,这在处理复杂的查询需求时非常有用。 接下来,我们关注"Ibatis.net实例"。通过提供的文件《IBatisNet开发使用小结.docx》和...
4. **动态SQL**:iBatis的动态SQL功能强大,可以实现条件查询、循环拼接SQL等复杂操作,避免了大量的字符串拼接。 5. **事务管理**:讲解如何在iBatis中进行事务控制,包括手动和自动提交、回滚以及事务隔离级别等...
在提供的文件“ibatis 开发指南.pdf”中,读者可以深入学习到Ibatis的安装步骤、基本使用方法、动态SQL的编写、缓存机制、以及如何进行关联查询和一对一、一对多的映射。这些内容对于理解和掌握Ibatis的开发至关重要...
此外,Ibatis的动态SQL功能使你能根据不同的条件灵活构建查询,这在处理大数据量时尤其有用。 接下来,我们来讨论Oracle数据库。Oracle是世界上最广泛使用的商业关系型数据库管理系统之一,尤其在企业级应用中。它...
本文旨在深入解析iBATIS映射文件的基础概念及其重要性,为初学者构建一个清晰的学习路径。 ### iBATIS映射文件:核心中的核心 iBATIS映射文件(Data Map XML File)是iBATIS框架的灵魂所在,它允许开发者明确地...
通过阅读博客全文,你可能会学习到更多关于如何有效地使用iBatis进行数据库操作和优化查询性能的知识。 综上所述,iBatis提供了一种简单、灵活的方式来处理数据库操作,特别是像模糊查询这样的复杂查询。通过将SQL...
- **动态映射**:ibatis支持动态SQL语句的编写,可以根据不同的条件构造SQL语句,从而满足更复杂的查询需求。 - **事务管理**:ibatis支持两种类型的事务管理机制:基于JDBC的事务管理和基于JTA的事务管理。 - **...
通过本教程书的学习,你将掌握Ibatis.net的基本使用方法,包括查询、插入、更新和删除数据,以及如何处理复杂的业务场景。同时,你还将了解到如何结合其他.NET技术,如Entity Framework或NHibernate,以实现更高效、...
在IT行业中,数据库操作是应用程序开发中的重要环节。Ibatis,作为一个轻量级的Java持久层框架,提供了灵活的映射机制,使得...通过学习和掌握Ibatis,你可以更高效地构建数据访问层,提升项目的可维护性和可扩展性。
### iBatis 2012中文学习书籍知识点解析 #### 一、iBatis与Hibernate的对比 **1.1 易于掌握** - **iBatis**: 文档阅读半天到两天即可基本掌握。 - **Hibernate**: 需要三倍以上的时间才能掌握。 **1.2 SQL优化...
本篇将深入探讨Ibatis3在Oracle数据库环境下的具体应用实例,涵盖CRUD(创建、读取、更新、删除)操作以及动态SQL的使用。 一、Ibatis3简介 Ibatis3是MyBatis的前身,它放弃了Hibernate的全对象关系映射,转而采用...
它支持动态SQL,允许我们在运行时构建复杂的查询。在iBatis中,SqlSession对象用于执行SQL,Mapper接口则作为Java代码与SQL映射文件的桥梁。 接着,我们来看Spring的角色。Spring通过其DI(Dependency Injection)...
### J2EE学习:Ibatis开发资料概要 #### 一、Ibatis简介与特点 Ibatis是一款半自动化的ORM(Object Relational Mapping)框架,它不像Hibernate等其他ORM工具那样提供完全自动化的数据库操作,而是更侧重于SQL语句...
- **动态SQL**:学习如何在SQL映射文件中实现条件判断,构建灵活的查询语句。 - **结果映射**:理解如何将数据库查询结果自动映射到Java对象,包括一对一、一对多、多对多关系的映射。 - **参数映射**:学习如何传递...
从中,你可以学习到动态SQL的使用,这是一种强大的特性,允许你在运行时根据条件动态地构建SQL语句。此外,还有关于事务管理、缓存机制、结果映射等方面的详细讲解。 "iBatis分页"是数据库操作中常见的需求,iBatis...