前段时间写了些
Hibernate
方面的
系列文章
,网友们反映还不错。在接下来的时间里,我将会引入另外一种
O/R Mapping
解决方案
——iBATIS
,本系列将沿用
Hibernate
系列文章的风格。
什么是
iBATIS
?
和众多的
SourceForge
开源项目一样,
iBATIS
曾经也是其中的一员。在
2004
年
11
月
3
日成功地成为了
Apache Incubator
下的子项目。
iBATIS
包括
for Java
和
for .NET
两个版本,
for Java
版提供了
SQL Maps
和
DAO
框架,
for .NET
只提供了
SQL Maps
框架。从现在开始我们只对
for Java
版的
SQL Maps
展开讨论。
你可以在
http://www.ibatis.com
下载
iBATIS for Java
,目前最新版本是
2.0.9
,压缩包里已经包含了
SQL Maps(ibatis-sqlmap-2.jar)
和
DAO
框架
(ibatis-dao-2.jar)
。
为什么选择
iBATIS
?
也许各位看官已在各种不同的技术资料上了解到它的优势。但是对于我来说,选择它的理由只有一个
——“
利用原有资源
”
。
Hibernate
的却优秀,但是用来整合原有系统,它却很难胜任。例如,以前在进行数据建模时使用了复合主键、跨越多表产生的几十甚至上百行的查询语句、利用原有存储过程
… …
当面临这一系列问题时
Hibernate
就显得力不从心了,要想使用
Hibernate
就只能改造原有系统!
当我面临系统整合问题时(整合的要求很简单:只需要保留原有系统查询部分),
iBATIS
进入了我的视线。原有系统中除
SQL
语句需要小小的修改外,数据表、查询结果都不需要改变!也不用像
Hibernate
那样映射出众多的配置文件、
POJO
,一下子清爽了很多。
BTW
:
Hibernate
这种做法没有错!只是我只需要查询功能,仅仅是取我所好而已,避免了杀鸡用牛刀。
目前,系统整合已经结束,花了一个月时间。如果使用
Hibernate
,恐怕我现在还在为怎么设计数据表、怎样下
HQL
而和同事争论。
开始另一次
O/R Mapping
之旅
上次
O/R Mapping
之旅的
BO
、数据表还可以重用,只是把数据库迁移到了
MySQL
。打开
Eclipse
,新建一个
Resin
项目。把
ibatis-sqlmap-2.jar
和
ibatis-common-2.jar
拷贝到
lib
目录下,再导入项目。和
Hibernate
自动配置、自动映射相比,
iBATIS
的一切都是手工完成的。
在
src
下建立配置文件
SqlMapConfig.xml
,数据库链接、连接池、
SqlMap
映射文件
… …
这些都要靠它了。官方参考手册对怎样进行设置有很详细的描述,我只对要用到的地方进行粗略说明。
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" "
http://www.ibatis.com/dtd/sql-map-config-2.dtd
">
<sqlMapConfig>
<settings cacheModelsEnabled="true" enhancementEnabled="true" lazyLoadingEnabled="true" errorTracingEnabled="false" maxRequests="32" maxSessions="10" maxTransactions="5" useStatementNamespaces="false" />
<transactionManager type="JDBC"> <dataSource type="SIMPLE"> <property name="JDBC.Driver" value="org.gjt.mm.mysql.Driver"/> <property name="JDBC.ConnectionURL" value="jdbc:mysql://localhost/new_db?useUnicode=true"/> <property name="JDBC.Username" value="root"/> <property name="JDBC.Password" value=""/> <property name="JDBC.DefaultAutoCommit" value="true"/> <property name="Pool.MaximumActiveConnections" value="10"/> <property name="Pool.MaximumIdleConnections" value="5"/> <property name="Pool.MaximumCheckoutTime" value="120000"/> <property name="Pool.TimeToWait" value="500"/> <property name="Pool.PingQuery" value="select 1 from ACCOUNT"/> <property name="Pool.PingEnabled" value="false"/> <property name="Pool.PingConnectionsOlderThan" value="1"/> <property name="Pool.PingConnectionsNotUsedFor" value="1"/> <property name="Pool.QuietMode" value="true"/> </dataSource> </transactionManager>
<sqlMap resource="bo/mapping/AutoMag.xml"/> </sqlMapConfig>
|
transactionManager
元素定义了
iBATIS
事务管理器。
type
可选项包括:
JDBC
:通过传统
JDBC
来管理事务。
JTA
:使用一个
JTA
全局事务,使
iBATIS
的事务包括在更大的事务范围内(跨数据库
Session
的),这个更大的事务范围可能包括了其他的数据库和事务资源。这个配置需要一个
UserTransaction
属性,以便从
JNDI
获得一个
UserTransaction
。
EXTERNAL
:调用
iBATIS
以外的其他事务管理器来管理事务。
dataSource
元素是
transactionManager
的一部分。
type
可选项包括:
SIMPLE
:
SIMPLE
是
iBATIS
内置的
dataSource
实现,其中实现了一个简单的数据库连接池,当无容器提供
DataSource
服务时可以使用该选项,对应
iBATIS
实现类为
com.ibatis.sqlmap.engine.datasource.SimpleDataSourceFactory
。
DBCP:
基于
Apache DBCP
连接池
API
实现的
DataSource
,当无容器提供
DataSource
服务时,可以使用该选项,对应
iBATIS
实现类为
com.ibatis.sqlmap.engine.datasource.DbcpDataSourceFactory
。
JNDI
:使用
J2EE
容器提供的
DataSource
实现,
DataSource
将通过指定的
JNDI Name
从容器中获取。对应
iBATIS
实现类为
com.ibatis.sqlmap.engine.datasource.JndiDataSourceFactory
。
注意!
每种
dataSource
元素的
property
都有不同的地方,不能光把
type
名字改了了事。
sqlMap
元素定义了映射文件的存放位置,配置文件中可包含多个
sqlMap
元素,比如:
你也许已发现,我只定义了单个映射文件。不错,和
Hibernate
的一个表一个映射文件不同,
iBATIS
的映射文件个数可以人为控制,颗粒度自己掌握。
光有
BO
和配置文件还不行,还要为本次测试创建测试类
AutoMag.java
。完整的布局如下所示:
以下为 iBATIS SQL Maps 工作流程,对于理解概念很有帮助。大意是 1、你可以把 JavaBean、Map 类型、原始变量(或者它们的Wrapper Class)、XML 数据作为传入对象;2、通过配置文件载入映射文件;3、利用框架翻译成 JDBC 来访问数据库;4、执行结果可以是 JavaBean、Map 类型、原始变量的 Wrapper Class、XML 数据。
请注意!引用、转贴本文应注明原作者:Rosen Jiang 以及出处:http://www.blogjava.net/rosen