自:http://www.codesky.net/article/doc/200412/2004121597969923.htm
什么是
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://blog.csdn.net/rosen)