文档库 最新最全的文档下载
当前位置:文档库 › iBATIS 2.0 开发指南

iBATIS 2.0 开发指南

IBATIS Developer’s Guide Version 1.0

OpenDoc Series’

iBATIS 2.0开发指南

V1.0

作者:夏昕xiaxin(at)https://www.wendangku.net/doc/9918526612.html, So many open source projects. Why not Open your Doc uments? J

文档说明

参与人员:

作者联络

夏昕xiaxin(at)https://www.wendangku.net/doc/9918526612.html,

(at) 为email @ 符号

发布记录

版本日期作者说明

0.0 2004.8.1 夏昕第一版

1.0 2004.9.1 夏昕补充ibatis in Spring部分

OpenDoc版权说明

本文档版权归原作者所有。

在免费、且无任何附加条件的前提下,可在网络媒体中自由传播。

如需部分或者全文引用,请事先征求作者意见。

如果本文对您有些许帮助,表达谢意的最好方式,是将您发现的问题和文档改进意见及时反馈给作者。当然,倘若有时间和能力,能为技术群体无偿贡献自己的所学为最好的回馈。

另外,笔者近来试图就日本、印度的软件开发模式进行一些调研。如果诸位可以赠阅日本、印度软件研发过程中的需求、设计文档以供研究,感激不尽!

ibatis Quick Start (5)

准备工作 (5)

构建ibatis基础代码 (5)

ibatis配置 (11)

ibatis基础语义 (16)

XmlSqlMapClientBuilder (16)

SqlMapClient (16)

SqlMapClient基本操作示例 (16)

OR映射 (19)

ibatis高级特性 (26)

数据关联 (26)

一对多关联 (26)

一对一关联 (28)

延迟加载 (30)

动态映射 (31)

事务管理 (35)

基于JDBC的事务管理机制 (35)

基于JTA的事务管理机制 (36)

外部事务管理 (38)

Cache (39)

MEMORY类型Cache与WeakReference (40)

LRU型Cache (42)

FIFO型Cache (43)

OSCache (43)

相对Hibernate和Apache OJB等“一站式”ORM解决方案而言,ibatis是一种“半自动化”的ORM实现。

所谓“半自动”,可能理解上有点生涩。纵观目前主流的ORM,无论Hibernate还是Apache OJB,都对数据库结构提供了较为完整的封装,提供了从POJO到数据库表的全套映射机制。程序员往往只需定义好了POJO到数据库表的映射关系,即可通过Hibernate 或者OJB提供的方法完成持久层操作。程序员甚至不需要对SQL的熟练掌握,Hibernate/OJB会根据制定的存储逻辑,自动生成对应的SQL并调用JDBC接口加以执行。

大多数情况下(特别是对新项目,新系统的开发而言),这样的机制无往不利,大有一统天下的势头。但是,在一些特定的环境下,这种一站式的解决方案却未必灵光。

在笔者的系统咨询工作过程中,常常遇到以下情况:

1.系统的部分或全部数据来自现有数据库,处于安全考虑,只对开发团队提供几条Select SQL(或存储过程)以获取所需数据,具体的表结构不予公开。

2.开发规范中要求,所有牵涉到业务逻辑部分的数据库操作,必须在数据库层由存储过程实现(就笔者工作所面向的金融行业而言,工商银行、中国银行、交

通银行,都在开发规范中严格指定)

3.系统数据处理量巨大,性能要求极为苛刻,这往往意味着我们必须通过经过高度优化的SQL语句(或存储过程)才能达到系统性能设计指标。

面对这样的需求,再次举起Hibernate大刀,却发现刀锋不再锐利,甚至无法使用,奈何?恍惚之际,只好再摸出JDBC准备拼死一搏……,说得未免有些凄凉,直接使用JDBC 进行数据库操作实际上也是不错的选择,只是拖沓的数据库访问代码,乏味的字段读取操作令人厌烦。

“半自动化”的ibatis,却刚好解决了这个问题。

这里的“半自动化”,是相对Hibernate等提供了全面的数据库封装机制的“全自动化”ORM实现而言,“全自动”ORM实现了POJO和数据库表之间的映射,以及SQL的自动生成和执行。而ibatis的着力点,则在于POJO与SQL之间的映射关系。也就是说,ibatis 并不会为程序员在运行期自动生成SQL执行。具体的SQL需要程序员编写,然后通过映射配置文件,将SQL所需的参数,以及返回的结果字段映射到指定POJO。

使用ibatis提供的ORM机制,对业务逻辑实现人员而言,面对的是纯粹的Java对象,这一层与通过Hibernate实现ORM而言基本一致,而对于具体的数据操作,Hibernate 会自动生成SQL语句,而ibatis则要求开发者编写具体的SQL语句。相对Hibernate等“全自动”ORM机制而言,ibatis以SQL开发的工作量和数据库移植性上的让步,为系统设计提供了更大的自由空间。作为“全自动”ORM实现的一种有益补充,ibatis的出现显得别具意义。

ibatis Quick Start

准备工作

1.下载ibatis软件包(https://www.wendangku.net/doc/9918526612.html,)。

2.创建测试数据库,并在数据库中创建一个t_user表,其中包含三个字段:

?id(int)

?name(varchar)

?sex(int)。

3.为了在开发过程更加直观,我们需要将ibatis日志打开以便观察ibatis运作的细节。

ibatis采用Apache common_logging,并结合Apache log4j作为日志输出组件。在CLASSPATH中新建log4j.properties配置文件,内容如下:

log4j.rootLogger=DEBUG, stdout

log4j.appender.stdout=org.apache.log4j.ConsoleAppender

https://www.wendangku.net/doc/9918526612.html,yout=org.apache.log4j.PatternLayout https://www.wendangku.net/doc/9918526612.html,yout.ConversionPattern=%c{1}-%m%n

log4j.logger.java.sql.PreparedStatement=DEBUG

构建ibatis基础代码

ibatis基础代码包括:

1.ibatis实例配置

value="com.p6spy.engine.spy.P6SpyDriver"/>

value="jdbc:mysql://localhost/sample"/>

value="10"/>

value="120000"/>

value="1"/>

value="1"/>

2.POJO(P lain Ordinary J ava O bject)

下面是我们用作示例的一个POJO:

}

public void setId(Integer id) {

this.id = id;

}

public String getName() {

return https://www.wendangku.net/doc/9918526612.html,;

}

public void setName(String name) {

https://www.wendangku.net/doc/9918526612.html, = name;

}

public Integer getSex() {

return this.sex;

}

public void setSex(Integer sex) {

this.sex = sex;

}

}

3.映射文件

与Hibernate不同。因为需要人工编写SQL代码,ibatis的映射文件一般采用手动编写(通过Copy/Paste,手工编写映射文件也并没想象中的麻烦)。

针对上面POJO的映射代码如下:

where name = #name#

]]>

parameterClass="user">

UPDATE t_user

SET

name=#name#,

sex=#sex#

WHERE id = #id#

]]>

parameterClass="user"

>

INSERT INTO t_user (

name,

sex)

VALUES (

#name#,

#sex#

)

parameterClass="https://www.wendangku.net/doc/9918526612.html,ng.String">

delete from t_user

where id = #value#

从上面的映射文件可以看出,通过

parameterClass="https://www.wendangku.net/doc/9918526612.html,ng.String"

resultClass="user"

cacheModel="userCache"

>

这表明对通过id为"getUser"的Select statement获取的数据,使用cacheModel "userCache"进行缓存。之后如果程序再次用此Statement 进行数据查询,即直接从缓存中读取查询结果,而无需再去数据库查询。

cacheModel主要有下面几个配置点:

l flushInterval :

设定缓存有效期,如果超过此设定值,则将此CacheModel的缓存清空。

l size:

本CacheModel中最大容纳的数据对象数量。

l flushOnExecute:

指定执行特定Statement时,将缓存清空。如updateUser操作将更

新数据库中的用户信息,这将导致缓存中的数据对象与数据库中的实际

数据发生偏差,因此必须将缓存清空以避免脏数据的出现。

关于Cache的深入探讨,请参见“高级特性”中的相关章节。

Statement配置:

相关文档