前段時間寫了些 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>
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 元素,比如:
<sqlMap resource="mapping/AutoMag1.xml"/><sqlMap resource="bo/mapping/AutoMag2.xml"/>
<sqlMap url=" file:///c:/eclipse/workspace/iBATISTest/src/bo/ AutoMag2.xml "/>… …
你也許已發現,我只定義了單個映射文件。不錯,和 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://m.tkk7.com/rosen
??????????????????????????????請注意!引用、轉貼本文應注明原作者:Rosen Jiang 以及出處:http://m.tkk7.com/rosen
Powered by: BlogJava Copyright © Rosen