軟體項目實訓及課程設計指導——如何正確地應用對象/關係映射(O/R Mapping)技術實現應用系統持久層中的各個DAO組件
1、了解軟體應用系統持久層實現中的對象/關係映射技術
(1)對象/關係映射(O/R Mapping)技術產生的背景
在J2EE系統平臺中,面向對象OOP技術中的對象實例數據(屬性或者狀態)的持久化操作的方式其實是多樣化的,這包括序列化/反序列化、保存為XML格式(也還應該屬於序列化,目前還可以保存為JSon格式的文本文件等)和保存為關係資料庫表等形式。而對於保存為關係資料庫表這樣的持久化形式,一般採用對象/關係映射技術實現。
(2)什麼是對象/關係映射(O/R Mapping)技術
對象/關係映射技術的本質,其實是一種「適配器」形式的轉換技術,它主要能夠對數據實現如下形式的雙向轉換:
1)把面向對象程序中的類轉換為物理資料庫系統中的資料庫表
2)將類中的各個成員屬性轉換到對應的物理資料庫系統中的資料庫表內的欄位
3)物理資料庫系統中的資料庫表內的某條記錄轉換為某個實體類的對象實例
4)對象之間的各種關係轉換為物理資料庫系統中的資料庫表之間的關係。
當然,這種轉換是雙向的!下圖所示是這種雙向轉換的原理圖示的局部截圖。
(3)為什麼要提供對象/關係映射(O/R Mapping)技術
由於關係資料庫系統仍然是目前企業軟體應用系統中使用最廣泛的數據存儲媒介,在實現「關係模型」的各種物理資料庫系統(如Oracle、MS SQLServer、DB2等)中存儲的是關係形式的數據和這些關係數據的靜態結構,它主要包括以下內容:
1)資料庫表、表索引、視圖、觸發器
2)表與表之間的關係參照完整性說明
而面向對象分析和設計中的「對象模型」是由以下內容組成:
1)具有狀態屬性和行為方法的域對象;
2)各個域對象實體類之間的關係(關聯、依賴、聚集、組合和泛化)。
正是由於「關係模型」和「對象模型」兩者在設計思想、設計原則和具體的技術實現方式、存儲的內容等方面都有明顯的差別,有必要將兩者都轉換為某一種統一的形式!從而可以採用統一的形式對這兩種不同形式的數據進行訪問,簡化數據訪問的複雜性和減少重複性地開發工作。
而目前的軟體開發過程從軟體應用系統的需求描述、需求分析,系統設計和系統實現、乃至系統測試等階段都運用面向對象的思想和設計方法、編程實現技術,很顯然有必要對常規方式下的軟體應用系統開發實現中的系統持久層的資料庫系統操作訪問的編程實現方式進行改造,期望也能夠應用面向對象的方式進行。
基於此目的,對象/關係映射(O/R Mapping)技術及相應的支持框架(包括商業和開源)、實現工具等在J2EE平臺中都相繼地出現了。如下示圖為支持對象/關係映射(O/R Mapping)技術的Hibernate應用框架的官方頁面信息的局部截圖。
因此,運用對象/關係映射(O/R Mapping)技術去開發資料庫相關的應用,首先可以節省大量的工作量,特別是減少了煩瑣的SQL語句的編寫;其次,能夠以對象為單位進行相應的資料庫操作,而在JDBC API相關實現技術中是以對象的屬性為單位。數據操作不僅簡單,而且數據的「粒度」更大。
2、J2EE系統平臺中的對象/關係映射技術有多種實現的方法和形式
對象/關係映射(O/R Mapping)的思想及具體的實現技術,其實在J2EE平臺中早就存在和早已被應用——如J2EE EJB組件中的實體Bean組件,這包括容器管理持久性(CMP,Container-Managed Persistence)的CMP和Bean管理持久性(BMP,Bean-Managed Persistence)的BMP兩種形式。
(1)J2EE EJB組件中的實體Bean組件 ——對象/關係映射實現之一
Sun公司(現在為Oracle公司)在J2EE EJB組件中的實體Bean組件的技術規範中提出了兩種形式的實體Bean組件——容器管理持久性(CMP,Container-Managed Persistence)和 Bean管理持久性(BMP,Bean-Managed Persistence)組件。
其中在容器管理持久性的CMP組件中也應用了對象/關係映射思想、而且也是通過標準的XML配置文件定義兩者之間的映射關係的信息、並且也都倡導把對象持久化的任務從軟體應用系統的業務邏輯程序代碼中分離出來。
但容器管理持久性的CMP組件技術和常規的輕量級的對象/關係映射(O/R Mapping)實現技術(如Hibernate應用框架等)相比,存在有以下幾個方面的不足:
1)CMP實體EJB組件必須嚴格遵守J2EE系統平臺的技術規範和編程實現要求,而常規的輕量級的對象/關係映射(如Hibernate應用框架等)的實現技術則是採用POJO(Plain Old Java Objects,簡單的Java對象)形式的實體組件。
2)CMP實體EJB組件只能運行在支持J2EE EJB技術規範的EJB容器中,在開發過程中的單元測試則必須要模擬EJB容器環境或者直接在EJB容器中進行——而這是比較困難的和繁瑣的實現過程;而採用POJO形式的普通實體組件,可以運行在任何一種Java運行的環境中,方便開發過程中的單元測試。
3)CMP實體EJB組件不能在J2EE EJB容器之外運行,也就無法實施J2EE容器外的開發和單元測試;而應用POJO形式的實體組件則可以採用J2EE容器外(不必要運行在J2EE Servlet容器中)的開發實現方法。
(2)Java Data Objects(JDO)——對象/關係映射實現之二
Java Data Objects(JDO)是SUN公司制定的描述對象持久化語義的標準API,JDO提供了透明的對象存儲實現技術,而複雜的對象存儲具體實現的工作由JDO產品的各個具體提供商的程序完成。應用JDO同樣也能夠讓軟體應用系統的開發人員集中時間和精力完成軟體應用系統中的業務邏輯功能實現。
如下示圖為JDO模式的工作原理示圖,在JDO模式中的整個應用分為四層次的應用結構。軟體應用系統的開發人員在業務邏輯層組件中不需再應用結構化查詢語言(SQL)語句操作訪問資料庫系統中的數據,因為JDO是作為Java資料庫連接JDBC API的一個補充和完善,但JDO並不意味著要取代JDBC。它們是兩種互相補充的應用技術,比如JDBC允許開發人員通過直接的資料庫訪問控制和緩存管理,從而提供給軟體應用系統的開發人員更大的靈活性。
從此工作原理示圖中可以了解到JDO比JDBC(只適用於面向關係資料庫系統)更通用,因為它提供了到任何數據底層的存儲功能實現的標準,比如關係資料庫、文件形式的序列化、XML等形式,使得基於JDO實現的應用系統具有更好的可移植性。如下為官方網站中對JDO技術標準的詳細介紹的資料頁面的局部截圖,讀者可以瀏覽相關的技術幫助文檔和下載與JDO相關的系統庫。
(3)Hibernate應用框架——對象/關係映射實現之三
Hibernate應用框架是一個開放原始碼的支持對象關係映射技術的框架,它對JDBC進行了非常輕量級的對象封裝和優化,從而使得開發人員能夠使用面向對象OOP的編程方法操作關係資料庫系統中的數據。
Hibernate框架不僅提供了從Java持久類到物理資料庫系統的數據表的映射,也提供了數據查詢和事務等機制。應用Hibernate框架能夠使得軟體應用系統的設計人員達到持久層設計上的解耦——業務邏輯與數據邏輯相分離,從而使得業務邏輯層開發人員不需要考慮資料庫表的邏輯結構、數據訪問邏輯與物理資料庫系統的結構相分離(數據訪問邏輯的開發者不需要再關心不同的物理資料庫系統之間的差異性);也能夠使得軟體應用系統的開發人員提高編碼效率和提高資料庫訪問性能(因為在Hibernate應用框架中提供了對連接池、數據緩存等技術實現的支持)。
下圖所示為Hibernate框架官方網站中下載其系統包文件的頁面內容截圖,讀者可以在Hibernate框架官方網站中下載其系統JAR包文件,然後在軟體應用系統項目中應用Hibernate框架。
(4)MyBatis框架——對象/關係映射實現之四
Hibernate應用框架能夠根據開發人員在映射關係定義的XML配置文件中的有關信息自動地完成對目標資料庫表的對象關係映射操作,這大大地簡化了軟體應用系統開發人員在軟體應用系統的持久層功能實現方面的技術複雜度,這是Hibernate應用框架能夠流行的一個主要原因。但也導致它缺少一定的靈活性!
因為在某些企業軟體應用系統中,物理資料庫系統的資料庫表的結構並不是完全公開的或者是由其它合作企業設計好資料庫表結構,另外也可能要求提高數據訪問的性能等方面的原因。此時軟體應用系統的設計和開發人員如果此時繼續再應用Hibernate框架實現O/R Mapping方面的功能,則可能會出現不盡人意的效果。而面對這樣的應用環境和需求,很多軟體應用系統的開發人員一般又繼續應用JDBC API編程實現系統中的這些功能。
而MyBatis框架則能夠很好地解決這些問題,因為它不會在運行期自動地生成SQL語句並執行數據訪問操作。繼續要求軟體應用系統的開發人員編寫具體的SQL 語句,然後通過映射配置文件,將SQL語句中所需的參數和返回的結果欄位映射到指定的POJO類對象中。下圖所示為MyBatis的官方網站(作者瀏覽的是中文版本)上對MyBatis框架的功能描述截圖。讀者同樣可以在MyBatis框架官方網站中下載其系統JAR包文件,然後在軟體應用系統項目中應用MyBatis框架,更多的技術介紹讀者可以瀏覽MyBatis框架官方網站頁面。
3、應用Hibernate框架與直接應用JDBC API編程實現上的主要區別
(1)Hibernate應用框架其實是對JDBC API技術的輕量級對象封裝
Hibernate應用框架也是一個獨立的對象關係映射實現的持久層應用框架,它可以用在任何JDBC可以使用的場合。當Java系統平臺中的某個軟體應用系統需要從一種物理資料庫系統環境移植到另一種物理資料庫系統環境中時,只需要修改Hibernate應用框架中與物理資料庫系統的資料庫連接有關的XML配置文件,而不需要修改或者只需要修改極少量的Java源程序代碼。
在MyEclipse開發工具中提供了對Hibernate框架的資料庫連接配置文件的可視化操作的支持,請見下圖所示的可視化操作界面。
(2)Hibernate應用框架採用XML文件來配置和定義對象/關係映射
開發人員在應用Hibernate框架實現對象和關係資料庫之間的映射時,通常是編寫一個XML文檔來配置和定義對象/關係映射。但這個XML格式的映射文檔被設計為易讀的,並且可以手工修改。映射語言是以Java為中心,這意味著映射文檔是按照持久化類的定義來創建的,而非資料庫表的定義。
此XML格式映射文件告訴 Hibernate 應用框架,它應該訪問目標資料庫系統中的哪個數據表以及應該使用資料庫表中的哪些欄位,另外Hibernate應用框架也需要通過此XML格式映射文件獲得如何加載和保存持久化類的對象實例。如下示圖為某個項目中的XML格式映射配置定義文件的示例局部截圖。
應用XML格式文件來配置對象/關係映射,有以下幾個方面的優點:
1)保證Hibernate應用框架既不會滲透到應用系統的上層域模型(業務處理層)中,也不會滲透到下層數據模型(資料庫系統)中。
2)軟體應用系統的開發人員可以獨立設計域模型,不必強迫遵守任何企業所提供的某個系統平臺的規範。
3)物理資料庫系統的資料庫設計人員可以獨立設計數據模型,也不必強迫遵守任何的技術規範。
4)軟體應用系統中的「對象/關係」映射的技術實現不依賴於任何程序代碼,如果需要修改「對象/關係」映射,只需要修改相關的XML格式的配置定義文件,不需要修改任何的程序代碼,提高了軟體應用系統的靈活性,並且使軟體應用系統的維護更加方便。