如何正確應用對象/關係映射技術實現應用系統持久層中各個DAO組件

2020-12-08 楊教授工作室

軟體項目實訓及課程設計指導——如何正確地應用對象/關係映射(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格式的配置定義文件,不需要修改任何的程序代碼,提高了軟體應用系統的靈活性,並且使軟體應用系統的維護更加方便。

相關焦點

  • 如何正確地設計J2EE應用系統持久層中的各個組件結構及組件間關係
    軟體項目實訓及課程設計指導——如何正確地設計J2EE應用系統持久層中的各個組件結構及關係1、了解J2EE應用系統數據持久層中的各個組件類的類型在J2EE系統平臺下的軟體應用系統的數據持久層,一般都包含有如下的各個組件類:實體類、數據訪問對象類(包括接口和對應的實現類
  • 如何正確地應用JDBC API設計實現應用系統持久層中的各個DAO組件
    軟體項目實訓及課程設計指導——如何正確地應用JDBC API設計和實現應用系統持久層中的各個DAO組件1、Java 系統平臺中實現資料庫連接技術相關的APIJava 資料庫連接技術(JDBC,Java DataBase Connectivity)是一種將Java
  • 如何合理地設計軟體應用系統中數據訪問服務層內的各個功能程序類
    軟體項目實訓及課程設計指導——如何合理地設計數據訪問服務層中的各個功能程序類作者已經在本系列文章《軟體項目實訓及課程設計指導--如何正確地設計J2EE應用系統持久層中的各個組件結構及關係》中為讀者介紹了為什麼要設計和應用數據訪問服務接口的目的及如何設計該接口以真正達到利用數據訪問服務層組件隔離業務處理邏輯和數據訪問操作邏輯的應用效果
  • 軟體項目實訓及課程設計指導——如何在數據持久層中應用DAO模式
    軟體項目實訓及課程設計指導——如何在J2EE應用系統數據持久層中應用DAO模式1、為什麼要在軟體應用系統中提供數據持久層軟體應用系統中的數據持久層主要為整個軟體應用系統提供數據訪問功能服務,從而可以使軟體應用系統中的業務層組件的設計和開發人員能夠專注於系統業務邏輯的開發
  • 如何優化Web應用數據訪問實現方式以提高軟體應用系統的響應性能
    1、在軟體應用系統中應用輕量級的XML文件IO訪問技術在J2EE Web應用系統的開發實現中,設計和開發實現人員可以將應用系統中不需要頻繁修改的數據(如軟體系統的配置數據、運行環境有關的參數、匯總統計查詢中用戶查詢頻繁但數據變動並不大等應用狀況下的數據)保存到XML格式的配置文件,而不要保存到物理資料庫系統的資料庫表中
  • 如何在Web應用系統表示層開發實現中應用Velocity模板技術
    軟體項目實訓及課程設計指導——如何在Web應用系統表示層開發實現中應用Velocity模板技術1、分離Web表示層的數據處理和展現邏輯的常見的應用技術分離Web表示層的數據處理和展現邏輯是目前企業級的Web應用系統開發中表現層組件開發實現中的基本實現目標。
  • 如何應用EhCache緩存框架提高J2EE Web應用系統持久層的響應性能
    軟體項目實訓及課程設計指導——如何應用EhCache緩存框架提高應用系統持久層響應性能1、在Web應用系統中應用持久層相關的緩存框架在Java應用程式開發實現和J2EE Web應用系統的設計和開發實現中,軟體應用系統的設計和開發實現人員可以在系統的表示層和系統的持久層中充分地應用緩存機制和相應實現技術能夠大大地提高
  • 如何應用觀察者設計模式重構系統中日誌處理功能實現的程序代碼
    軟體項目實訓及課程設計指導——如何應用觀察者設計模式重構系統中的日誌處理功能實現的程序代碼1、GOF設計模式中的觀察者設計模式(1)什麼是觀察者設計模式GOF設計模式中的觀察者設計模式定義了一種解耦「一對多」的依賴關係的編程模式
  • 如何保證軟體應用系統架構設計結果的可擴展性和可重用性(上篇)
    利用控制反轉技術能夠消解框架系統和軟體應用系統之間的依賴關係——因為利用「控制反轉」技術能夠減少對象的請求者對服務提供者的特定功能實現邏輯的依賴,此時系統中的各個組件類不再需要自己去查找或者實例化它們所依賴的其它目標組件類的對象實例。
  • 如何正確地應用Web MVC架構模式分離表示層和模型處理層耦合關係
    軟體項目實訓及課程設計指導——如何正確地應用Web MVC架構模式分離表示層和模型處理層耦合關係 1、MVC體系架構設計模式是用來幫助系統設計人員控制「變化」的一種設計模式 MVC體系架構設計模式是上世紀80年代在Smalltalk
  • 軟體項目實訓及課程設計指導——如何實現面向對象的系統架構設計
    因此,在軟體應用系統的設計、開發實現中應該要綜合應用面向對象(OOP)的編程技術和面向方面(AOP)的編程技術。在如下示圖中的程序代碼中夾雜有大量的日誌功能實現的程序代碼,導致日誌功能實現的程序代碼水平地散布在所有對象的層次中----在控制層、業務層和數據訪問層都需要這樣的日誌功能實現,並且而與它所散布到的對象的核心功能毫無關係。
  • 課程設計指導——如何應用Java反射技術靈活地創建程序類對象實例
    軟體項目實訓及課程設計指導——如何應用Java反射技術靈活地創建程序類的對象實例1、如何應用屬性配置文件實現對系統中的配置信息進行讀寫操作Java中的屬性配置文件主要可以作為軟體應用系統及項目的配置文件,比如許多J2EE的開源框架系統中都提供了屬性配置文件作為該應用框架的對外配置文件
  • 軟體項目實訓及課程設計指導——系統概要設計中的組件設計示例
    如下示圖為Rose UML開發工具軟體中創建UML組件的功能菜單的局部截圖:UML技術規範中的組件圖是由組件、接口和組件之間的關系所構成的,組件圖一方面能夠幫助軟體應用系統的開發人員理解軟體應用系統的最終結構——因為組件圖可以描述出軟體應用系統的構成組件以及各個組件之間的相互關係;另一方面也使得開發實現工作有一個明確的開展目標和有利於項目開發小組中的其他人員(
  • 在程序中如何正確地創建和銷毀軟體應用系統中文件IO流對象實例
    軟體項目實訓及課程設計指導——如何正確地創建和銷毀軟體應用系統中文件IO流對象實例1、Java文件輸入輸出(讀寫)相關的技術基礎知識(1)流(Stream)它是通過緩衝機制將數據從生產者(如鍵盤、磁碟文件、內存或其他設備
  • 如何保證軟體應用系統架構設計結果的可擴展性和可重用性(下篇)
    軟體項目實訓及課程設計指導——如何保證軟體應用系統架構設計結果的可擴展性和可重用性(下篇)4、封裝軟體應用系統中的各個核心功能模塊面向對象技術中的封裝性是保證軟體應用系統具有良好的模塊性的基礎,並且封裝能夠防止軟體應用系統中相互依賴性所帶來的變動影響——因為封裝機制能夠避免模塊以外的程序代碼被隨意地訪問或者存取模塊內部的屬性
  • 軟體項目實訓及課程設計指導——UML靜動態建模在詳細設計中應用
    1、軟體應用系統業務層組件中業務類的設計軟體應用系統中的業務層也稱為應用服務層,良好的業務層中的各個組件類設計可以使得應用系統中的表示層採用不同的實現技術而不影響到系統中的業務層的功能實現。)類;當然,也還要考慮業務數據的存取方式,一般可以藉助對象關係映射(O/R Mapping)技術來實現將業務實體映射到關係型資料庫表中,業務實體中的各個成員屬性映射到關係型資料庫表中的欄位。
  • 如何在Web應用中實現Velocity 與Struts 框架相互集成的應用實例
    軟體項目實訓及課程設計指導——如何在Web應用系統中實現Velocity 與Struts 框架相互集成的應用實例1、Velocity Tools 子項目及其中的 VelocityStruts 組件(1)Velocity Tools是什麼
  • 如何合理地創建對象實例以降低程序類之間關係的耦合度
    OOP編程開發中軟體應用系統的開發人員所必須要面對的問題,軟體應用系統中的業務活動是由各個對象實例之間的相互交互而構成的。但頻繁地創建對象實例不僅會降低軟體應用系統的整體運行的性能,也增加了不必要的程序類之間的耦合關係。如下示圖中的Employee類與其中的TimeCard類之間就存在有「一對多」 形式的關聯關係,因為在Employee類的對象實例中耦合有TimeCard類的對象實例。因此,如何正確和合理地創建出類的對象實例?
  • 如何應用GOF設計模式中的創建型模式實現鬆耦合地創建對象實例
    軟體項目實訓及課程設計指導——如何應用GOF設計模式中的創建型模式實現鬆耦合地創建對象實例1、GOF設計模式中的工廠模式在GOF設計模式的劃分中,把與實現對象的實例化相關的模式稱之為「創建型模式」——而其中的工廠模式為創建型模式中的一種具體實現形式。
  • 如何正確地創建和銷毀軟體應用系統中網絡通訊中的Socket對象實例
    軟體項目實訓及課程設計指導——如何正確地創建和銷毀軟體應用系統中網絡通訊中的Socket對象實例1、基於TCP/IP協議的Socket通信相關的基礎知識(1)TCP/IP(Transmission Control Protocol傳輸控制協議/Internet