iBATIS开发指南.docx
《iBATIS开发指南.docx》由会员分享,可在线阅读,更多相关《iBATIS开发指南.docx(59页珍藏版)》请在冰豆网上搜索。
iBATIS开发指南
IBATISDeveloper’sGuideVersion1.0
September2,2004Somanyopensourceprojects.WhynotOpenyourDocuments?
OpenDocSeries’
iBATIS2.0开发指南
ibatis开发指南
ibatisQuickStart............................................................................................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
IBATISDeveloper’sGuideVersion1.0
September2,2004Somanyopensourceprojects.WhynotOpenyourDocuments?
ibatis开发指南
相对Hibernate和ApacheOJB等“一站式”ORM解决方案而言,ibatis是一种“半
自动化”的ORM实现。
所谓“半自动”,可能理解上有点生涩。
纵观目前主流的ORM,无论Hibernate还是
ApacheOJB,都对数据库结构提供了较为完整的封装,提供了从POJO到数据库表的全
套映射机制。
程序员往往只需定义好了POJO到数据库表的映射关系,即可通过Hibernate
或者OJB提供的方法完成持久层操作。
程序员甚至不需要对SQL的熟练掌握,
Hibernate/OJB会根据制定的存储逻辑,自动生成对应的SQL并调用JDBC接口加以执
行。
大多数情况下(特别是对新项目,新系统的开发而言),这样的机制无往不利,大有一
统天下的势头。
但是,在一些特定的环境下,这种一站式的解决方案却未必灵光。
在笔者的系统咨询工作过程中,常常遇到以下情况:
1.系统的部分或全部数据来自现有数据库,处于安全考虑,只对开发团队提供几
条SelectSQL(或存储过程)以获取所需数据,具体的表结构不予公开。
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的出现显
得别具意义。
IBATISDeveloper’sGuideVersion1.0
September2,2004Somanyopensourceprojects.WhynotOpenyourDocuments?
ibatisQuickStart
准备工作
1.下载ibatis软件包()。
2.创建测试数据库,并在数据库中创建一个t_user表,其中包含三个字段:
Øid(int)
Øname(varchar)
Øsex(int)。
3.为了在开发过程更加直观,我们需要将ibatis日志打开以便观察ibatis运作的细节。
ibatis采用Apachecommon_logging,并结合Apachelog4j作为日志输出组件。
在
CLASSPATH中新建log4j.properties配置文件,内容如下:
log4j.rootLogger=DEBUG,stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%c{1}-%m%n
log4j.logger.java.sql.PreparedStatement=DEBUG
构建ibatis基础代码
ibatis基础代码包括:
1.ibatis实例配置
一个典型的配置文件如下(具体配置项目的含义见后):
xmlversion="1.0"encoding="UTF-8"?
>
DOCTYPEsqlMapConfig
PUBLIC"-//iBATIS.com//DTDSQLMapConfig2.0//EN"
"
cacheModelsEnabled="true"
enhancementEnabled="true"
lazyLoadingEnabled="true"
errorTracingEnabled="true"
maxRequests="32"
maxSessions="10"
maxTransactions="5"
useStatementNamespaces="false"
/>
IBATISDeveloper’sGuideVersion1.0
September2,2004Somanyopensourceprojects.WhynotOpenyourDocuments?
value="com.p6spy.engine.spy.P6SpyDriver"/>
value="jdbc:
mysql:
//localhost/sample"/>
value="10"/>
value="120000"/>
ACCOUNT"/>
value="1"/>
value="1"/>
2.POJO(PlainOrdinaryJavaObject)
下面是我们用作示例的一个POJO:
publicclassUserimplementsSerializable{
privateIntegerid;
privateStringname;
privateIntegersex;
privateSetaddresses=newHashSet();
/**defaultconstructor*/
publicUser(){
}
publicIntegergetId(){
returnthis.id;
IBATISDeveloper’sGuideVersion1.0
September2,2004Somanyopensourceprojects.WhynotOpenyourDocuments?
}
publicvoidsetId(Integerid){
this.id=id;
}
publicStringgetName(){
returnthis.name;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicIntegergetSex(){
returnthis.sex;
}
publicvoidsetSex(Integersex){
this.sex=sex;
}
}
3.映射文件
与Hibernate不同。
因为需要人工编写SQL代码,ibatis的映射文件一般采
用手动编写(通过Copy/Paste,手工编写映射文件也并没想象中的麻烦)。
针对上面POJO的映射代码如下:
xmlversion="1.0"encoding="UTF-8"?
>
DOCTYPEsqlMap
PUBLIC"-//iBATIS.com//DTDSQLMap2.0//EN"
"
parameterClass="java.lang.String"
resultClass="user">
[CDATA[
select
name,
sex
fromt_user
IBATISDeveloper’sGuideVersion1.0
September2,2004Somanyopensourceprojects.WhynotOpenyourDocuments?
wherename=#name#
]]>
parameterClass="user">
[CDATA[
UPDATEt_user
SET
name=#name#,
sex=#sex#
WHEREid=#id#
]]>
parameterClass="user"
>
INSERTINTOt_user(
name,
sex)
VALUES(
#name#,
#sex#
)
parameterClass="java.lang.String">
deletefromt_user
whereid=#value#
从上面的映射文件可以看出,通过、、、
在这
四个节点中,我们指定了对应的SQL语句,以update节点为例:
……
parameterClass="user">⑵
[CDATA[⑶
UPDATEt_user⑷
SET(
IBATISDeveloper’sGuideVersion1.0
September2,2004Somanyopensourceprojects.WhynotOpenyourDocuments?
name=#name#,⑸
sex=#sex#⑹
)
WHEREid=#id#⑺
]]>
……
⑴ID
指定了操作ID,之后我们可以在代码中通过指定操作id来执行此节点所定
义的操作,如:
sqlMap.update("updateUser",user);
ID设定使得在一个配置文件中定义两个同名节点成为可能(两个update节
点,以不同id区分)
⑵parameterClass
指定了操作所需的参数类型,此例中update操作以
com.ibatis.sample.User类型的对象作为参数,目标是将提供的User
实例更新到数据库。
parameterClass="user"中,user为“com.ibatis.sample.User”
类的别名,别名可通过typeAlias节点指定,如示例配置文件中的:
⑶
[CDATA[……]]>
通过
[CDATA[……]]>节点,可以避免SQL中与XML规范相冲突的字符对
XML映射文件的合法性造成影响。
⑷执行更新操作的SQL,这里的SQL即实际数据库支持的SQL语句,将由
ibatis填入参数后交给数据库执行。
⑸SQL中所需的用户名参数,“#name#”在运行期会由传入的user对象的name
属性填充。
⑹SQL中所需的用户性别参数“#sex#”,将在运行期由传入的user对象的
sex属性填充。
⑺SQL中所需的条件参数“#id#”,将在运行期由传入的user对象的id属性
填充。
对于这个示例,ibatis在运行期会读取id为“updateUser”的update节点
的SQL定义,并调用指定的user对象的对应getter方法获取属性值,并用此
属性值,对SQL中的参数进行填充后提交数据库执行。
此例对应的应用级代码如下,其中演示了ibatisSQLMap的基本使用方法:
Stringresource="com/ibatis/sample/SqlMapConfig.xml";
Readerreader;
IBATISDeveloper’sGuideVersion1.0
September2,2004Somanyopensourceprojects.WhynotOpenyourDocuments?
reader=Resources.getResourceAsReader(resource);
XmlSqlMapClientBuilderxmlBuilder=
newXmlSqlMapClientBuilder();
SqlMapClientsqlMap=xmlBuilder.buildSqlMap(reader);
//sqlMap系统初始化完毕,开始执行update操作
try{
sqlMap.startTransaction();
Useruser=newUser();
user.setId(newInteger
(1));
user.setName("Erica");
user.setSex(newInteger
(1));
sqlMap.update("updateUser",user);
sqlMmitTransaction();
finally{
sqlMap.endTransaction();
}
其中,SqlMapClient是ibatis运作的核心,所有操作均通过SqlMapClient
实例完成。
可以看出,对于应用层而言,程序员面对的是传统意义上的数据对象,而非JDBC
中烦杂的ResultSet,这使得上层逻辑开发人员的工作量大大减轻,同时代码更
加清晰简洁。
数据库操作在映射文件中加以定义,从而将数据存储逻辑从上层逻辑代码中独立
出来。
而底层数据操作的SQL可配置化,使