`

ibatis 动态映射机制

阅读更多

对于这个组合查询页面,根据用户选择填写的内容,我们应为其生成不同的查询语句。如用户没有填写任何信息即提交查询请求,我们应该返回所有记录:
Select * from t_user;
如用户只在页面上填写了姓名“Erica”,我们应该生成类似:
Select * from t_user where name like ‘%Erica%’ ;的SQL查询语句。
如用户只在页面上填写了地址“Beijing”,我们应该生成类似:
Select * from t_user where address like ‘%Beijing%”;的SQL。
而如果用户同时填写了姓名和地址(”Erica”&’Beijing’),则我们应生成类似:
Select * from t_user where name like ‘%Erica%’ and address like ‘%Beijing%”的SQL查询语句

对于ibatis 这样需要预先指定SQL 语句的ORM 实现而言,ibatis引入了动态映射机制,即在statement定义中,根据不同的查询参数,设定对应的SQL语句。

 

 

<select id="getUsers" parameterClass="user" resultMap="get-user-result"> select id,name,sex from t_user <dynamic prepend="WHERE"> <isNotEmpty prepend="AND" property="name"> (name like #name#) </isNotEmpty> <isNotEmpty prepend="AND" property="address"> (address like #address#) </isNotEmpty> </dynamic> </select>

 


 

通过dynamic 节点,我们定义了一个动态的WHERE 子句。此WHERE 子句中将可能包含两个针对name 和address 字段的判断条件。
而这两个字段是否加入检索取决于用户所提供的查询条件(字段是否为空[isNotEmpty])。
对于一个典型的Web程序而言,我们通过HttpServletRequest获得表单中的字段名并将其设入查询参数,如:
user.setName(request.getParameter("name"));
user.setAddress(request.getParameter("address"));
sqlMap.queryForList("User.getUsers", user);

在执行queryForList("User.getUsers", user)时,ibatis 即根据配置文件中设定的SQL动态生成规则,创建相应的SQL语句。
上面的示例中,我们通过判定节点isNotEmpty,指定了关于name 和address 属
性的动态规则:
<isNotEmpty prepend="AND" property="name">
(name like #name#)
</isNotEmpty>
这个节点对应的语义是,如果参数类的"name"属性非空(isNotEmpty,即非空
字符串””)
,则在生成的SQL Where字句中包括判定条件(name like #name#),其
中#name#将以参数类的name属性值填充。Address属性的判定生成与name属性完全相同,这里就不再赘述。

这样,我们通过在statement 定义中引入dynamic 节点,很简单的实现了SQL 判定子句的动态生成,对于复杂的组合查询而言,这将带来极大的便利。判定节点的定义可以非常灵活,我们甚至可以使用嵌套的判定节点来实现复杂的动态映射,如:
<isNotEmpty prepend="AND" property="name">
   ( name=#name#)
</isNotEmpty>
<isNotEmpty prepend="AND" property="address">
   (address=#address#)
</isNotEmpty>
这段定义规定,只有用户提供了姓名信息时,才能结合地址数据进行查询(如果只提供地址数据,而将姓名信息忽略,将依然被视为全检索)。Dynamic节点和判定节点中的prepend属性,指明了本节点中定义的SQL子句在
主体SQL中出现时的前缀。如:

<dynamic prepend="WHERE">
<isNotEmpty prepend="AND" property="name">
(name like #name#)
</isNotEmpty>
<isNotEmpty prepend="AND" property="address">
(address like #address#)
</isNotEmpty>
</dynamic>

 


假设"name"属性的值为“Erica”, "address"属性的值为“Beijing”,则会生成类似下面的SQL子句(实际运行期将生成带占位符的PreparedStatement,之后再为其填充数据):

WHERE (name like ‘Beijing’) AND (address like ‘Beijing’)

其中WHERE 之后的语句是在dynamic 节点中所定义,因此以dynamic 节点的prepend设置("WHERE")作为前缀,而其中的”AND”,实际上是address属性所对应的isNotEmpty节点的prepend设定,它引领了对应节点中定义的SQL子句。至于name属性对应的isNotEmpty节点,由于ibatis会自动判定是否需要追加prepend前缀,这里(name like #name#)是WHERE 子句中的第一个条件子句,无需AND 前缀,所以自动省略。

判定节点并非仅限于isNotEmpty,ibatis中提供了丰富的判定定义功能。判定节点分两类:
Ø 一元判定
一元判定是针对属性值本身的判定,如属性是否为NULL,是否为空值等。
上面示例中isNotEmpty就是典型的一元判定。

一元判定节点有:
节点名 描述
<isPropertyAvailable> 参数类中是否提供了此属性
<isNotPropertyAvailable> 与<isPropertyAvailable>相反
<isNull> 属性值是否为NULL
<isNotNull> 与<isNull>相反
<isEmpty> 如果属性为Collection或者String,其size是否<1,如果非以上两种类型,则通过String.valueOf(属性值)
获得其String类型的值后,判断其size是否<1<isNotEmpty> 与<isEmpty>相反


Ø 二元判定
二元判定有两个判定参数,一是属性名,而是判定值,如
<isGreaterThan prepend="AND" property="age"
compareValue="18">
(age=#age#)
</isGreaterThan>
其中,property="age"指定了属性名”age”,compareValue=”18”指明了判定值为”18”。上面判定节点isGreaterThan 对应的语义是:如果age 属性大于18(compareValue),则在SQL中加入(age=#age#)条件。
二元判定节点有:
节点名 属性值与compareValues的关系
<isEqual> 相等。
<isNotEqual> 不等。
<isGreaterThan> 大于
<isGreaterEqual> 大于等于
<isLessThan> 小于
<isLessEqual> 小于等于

 

一元条件元素
一元条件元素检查属性的状态是否符合特定的条件。
一元条件元素的属性:
prepend - 可被覆盖的SQL语句组成部分,添加在语句的前面(可选)
property - 被比较的属性(必选)

<isPropertyAvailable>

检查是否存在该属性(存在parameter bean的属性)。

<isNotPropertyAvailable>

检查是否不存在该属性(不存在parameter bean的属性)。

<isNull>

检查属性是否为null

<isNotNull>

检查属性是否不为null

<isEmpty>

 

检查Collection.size()的值,属性的StringString.valueOf(),是否为null或空(“”或size() < 1)。

 

<isNotEmpty>

 

检查Collection.size()的值,属性的StringString.valueOf(),是否不为null或不为空(“”或size() > 0)。 例子:

 <isNotEmpty prepend=”AND” property=”firstName” > FIRST_NAME=#firstName# </isNotEmpty>

 

还有两个其它的条件元素,<isParameterPresent>,<iterate>就不说了,用到的时候可以再查。

 

 二元条件元素
       二元条件元素将一个属性值和一个静态值或另一个属性值比较,如果条件为“真”,元素体的内容将被包括在查询SQL语句中。
 二元条件元素的属性: 
prepend - 可被覆盖的SQL语句组成部分,添加在语句的前面(可选)property - 被比较的属性(必选)
compareProperty - 另一个用于和前者比较的属性(必选或选择compareValue)
 compareValue - 用于比较的值(必选或选择compareProperty)

二元条件元系的属性

<isEqual>

比较属性值和静态值或另一个属性值是否相等。

<isNotEqual>

比较属性值和静态值或另一个属性值是否不相等。

<isGreaterThan>

比较属性值是否大于静态值或另一个属性值。

<isGreaterEqual>

比较属性值是否大于等于静态值或另一个属性值。

<isLessThan>

比较属性值是否小于静态值或另一个属性值。

<isLessEqual>

比较属性值是否小于等于静态值或另一个属性值。 例子: <isLessEqual prepend=”AND” property=”age” compareValue=”18”> ADOLESCENT = ‘TRUE’ </isLessEqual>

 

分享到:
评论
1 楼 lsjinpeng 2011-10-17  
      看过,看来就这么多知识了

相关推荐

    iBATIS-SqlMaps,ibatis映射文件

    在映射文件中,iBATIS提供了强大的映射机制,比如自动类型转换、结果集嵌套处理、自动生成主键等。例如,和可以将查询结果的列名映射到Java对象的属性上,元素可以根据特定列的值来决定如何映射结果集,实现多态查询...

    ibatis 的关系映射

    6. 关于优化iBATIS映射性能的最佳实践和技巧。 总之,"ibatis 的关系映射" 是一个涵盖广泛话题的领域,包括ORM策略、框架内部机制和开发工具的使用,对于希望深入理解和应用iBATIS的开发者来说,是非常有价值的内容...

    ibatis配置文件、映射文件详解

    ### ibatis配置文件、映射文件详解 #### 1. SQL Map Config 文件详解 在ibatis框架中,`sqlMapConfig.xml`是一个非常重要的配置文件,它主要用于设置ibatis的全局配置信息,包括数据库连接信息、环境配置以及其它...

    ibatis映射文件信息,接口对应

    在实际项目中,使用Ibatis进行持久层管理可以极大地提高开发效率,减少代码量,并且通过灵活的映射机制,能够适应多种数据库。同时,由于Ibatis不完全是一种ORM框架,它避免了ORM带来的性能开销,更适合大数据量的...

    Ibatis一对一映射提示

    在Java Web开发中,iBATIS(现在被称为MyBatis)是一个流行的持久层框架,它提供了灵活的SQL映射机制,使得开发者可以更方便地操作数据库。本篇将深入讲解iBATIS一对一映射的概念、配置及应用,帮助你更好地理解和...

    IBatis.Net运行机制和最佳实践

    ### IBatis.Net 运行机制和最佳实践 #### IBatis.Net 的起源与发展 IBatis.Net最初源于个人开发者的需求,为了简化频繁的手动编写JDBC代码的过程。随着时间的推移,尤其是2002年微软发布.NET平台后,该工具逐渐受...

    解决IBatis缓存动态字段问题

    这种情况下,由于IBatis的缓存机制,可能导致字段找不到的问题。具体表现为:当第一次查询某个表时,IBatis会将查询结果中的字段名缓存起来;而在后续查询其他表时,如果这些表的字段与之前缓存的字段不一致,就会...

    IBATIS动态查询语句.doc

    本文将深入探讨IBATIS动态查询语句的运用,解析其背后的逻辑与机制,以及如何利用这些特性来增强查询的灵活性与安全性。 ### IBATIS动态查询基础 IBATIS,现在更广为人知的名字为MyBatis,是一种半自动映射的持久...

    Ibatis 框架基础

    四、Ibatis的映射机制 Ibatis的映射分为两种:结果映射和参数映射。结果映射用于将查询结果转换为Java对象,参数映射则是将Java对象的属性值转化为SQL语句的参数。 1. 结果映射:通过`&lt;resultMap&gt;`标签定义,可以...

    ibatis源码,ibatis源码 ibatis源码 ibatis源码

    iBatis的核心在于它的SQL映射机制,它将数据库操作与业务逻辑解耦,使得开发者可以自由地编写SQL,同时保持代码的可维护性。本文将通过分析iBatis的源码,深入探讨其设计理念和实现机制。 一、iBatis架构概述 ...

    ibatis总结 ibatis ibatis ibatis ibatis

    总结,Ibatis提供了灵活的SQL映射机制,使得开发人员能够更好地控制SQL的执行。同时,通过与Struts和Spring的整合,可以构建出强大的企业级应用。理解并熟练掌握这些知识点,对于提升Java Web开发的效率和质量至关...

    ibatis3应用实例(oracle数据库)

    Ibatis3是一款优秀的Java持久层框架,它提供了灵活的SQL映射机制,使得开发者可以更好地控制数据库的交互。本篇将深入探讨Ibatis3在Oracle数据库环境下的具体应用实例,涵盖CRUD(创建、读取、更新、删除)操作以及...

    ibatis demo,ibatis例子,ibatis示例

    4. **动态SQL**:Ibatis的动态SQL功能非常强大,可以在XML映射文件中通过`&lt;if&gt;`、`&lt;choose&gt;`、`&lt;when&gt;`、`&lt;otherwise&gt;`、`&lt;where&gt;`等标签实现条件判断,使得SQL语句更加灵活。 5. **参数映射**:Ibatis支持多种方式...

    Ibatis

    作为一个轻量级的框架,Ibatis 提供了灵活的映射机制,使得 XML 或注解方式的 SQL 映射成为可能,大大简化了数据访问层(DAL)的开发工作。 **1. Ibatis 的核心概念** 1.1 SQL 映射文件:Ibatis 的核心是 SQL 映射...

    ibatisDemo.zip

    2. **映射机制**:Ibatis提供了强大的映射机制,可以将查询结果自动转换为Java对象,减少了手动处理结果集的步骤。 3. **参数映射**:对于复杂的参数类型,Ibatis可以通过Map或注解方式轻松处理,支持传入复杂参数。...

    IBatis.DataMapper.1.6.2

    2. **动态 SQL**: IBatis 支持动态 SQL,这意味着可以在 SQL 查询中根据条件动态地构造不同的 SQL 语句,增强了 SQL 的灵活性和可扩展性。 3. **数据参数化**: 使用 IBatis,可以轻松地将 C# 对象的属性绑定到 SQL ...

    ibatis配置、映射文件详解.doc

    《iBatis配置与映射文件详解》 iBatis,作为一个轻量级的持久层框架,以其灵活的SQL映射和良好的数据库交互性深受开发者喜爱。本文将深入解析iBatis的核心配置文件`sqlMapConfig.xml`,以及映射文件的使用方法,...

    ibatis2.3.4.rar

    Ibatis 是一款优秀的Java持久层框架,它与Hibernate和JPA等ORM框架不同,Ibatis 提供了更为灵活的SQL映射机制,允许开发者直接编写SQL语句,从而更好地控制查询过程,提高性能。在本资源"ibatis2.3.4.rar"中,包含了...

    pojo+xDoclet生成ibatis映射文件

    ### POJO + XDoclet 生成 iBatis 映射文件详解 #### XDoclet 基本原理 XDoclet 是一个强大的源代码注释处理工具,它通过解析 Java 源代码中的 Javadoc 注释标签来生成各种类型的文档或配置文件。这种机制使得...

    ibatis应用

    iBatis的映射机制主要包括两种:结果映射和参数映射。 - **结果映射**:用于将数据库查询的结果转换为Java对象。通过标签,我们可以定义列名和Java字段之间的对应关系。 - **参数映射**:在动态SQL中,通过和标签将...

Global site tag (gtag.js) - Google Analytics