本文是對Java常用域對象持久化技術的比較。在本文中介紹瞭域對象的概念,討論瞭為什麼要引入持久化技術,並對目前5種Java常用的域對象持久化技術進行比較,評價它們各自的優缺點和適用范圍。
一. 應用程序的分層體系結構
3層結構是目前典型的應用軟件結構,3層即表述層、業務邏輯層和數據庫層。其中表述層提供與用戶的交互界面,GUI和Web頁面是表述層的兩個典型的例子;業務邏輯層實現各種業務邏輯;數據庫層負責存放和管理應用的持久性數據。
在上述的三層結構中,業務邏輯層不僅負責業務邏輯,而且直接訪問數據庫,提供對業務數據的保存、更新、刪除和查詢操作。如果數據庫改變或數據庫的表結構發生變化,對業務邏輯層的影響非常大。為瞭把數據訪問細節與業務邏輯分開,可以把數據訪問作為單獨的持久化層。持久化層封裝瞭數據訪問細節,為業務邏輯層提供瞭面向對象的API。完善的持久化層應達到以下目標:
? 代碼可重用性高,能夠完成所有的數據庫訪問操作;
? 能夠支持多種數據庫平臺;
? 具有相對獨立性,當持久化層發生變化時,不會影響上層的實現。
二. 軟件的模型
在軟件開發領域,模型用來表示真實世界的實體。在軟件開發的不同階段,需要為目標系統創建不同類型的模型。在分析階段,需要創建概念模型。在設計階段,需要創建域模型和數據模型。
構成域模型的基本元素就是域對象,即Domain Object,是對真實世界的實體的抽象。域對象可以代表業務領域中的人、地點、事務或概念。域對象包括3種:實體域對象、過程域對象和事件域對象。在三層應用結構中,以上3種域對象都位於業務邏輯層,實體域對象是應用的業務數據在內存中的表現形式,而過程域對象用於執行業務邏輯。
當實體域對象在內存中創建後,他們不可能永遠存在,因此必須對域對象進行持久化。狹義的理解,“持久化”僅僅是把域對象永久保存到數據庫中;廣義的理解,“持久化”包括和數據庫的各種相關操作,如:保存、更新、刪除、加載、查詢等。
三. Java中常用域對象持久化技術的比較
目前Java中共有5種常用的實現持久化的模式:
? JDBC直接訪問數據庫
? 主動域對象模式
? CMP模式
? ORM模式
? JDO模式
1、JDBC直接訪問數據庫
在這幾種模式中JDBC的歷史最為悠久,從Java誕生的那天起就有瞭JDBC,目前已經發展到JDBC3.0瞭。JDBC是一套規范,她規定瞭統一的標準接口,各個數據庫廠商提供標準接口的實現。因此,隻需要掌握標準的SQL語言就可以訪問各種不同的數據庫瞭。JDBC規范的出臺,向世界宣告從此有瞭訪問關系數據庫的標準通用接口瞭。JDBC規范一經發佈,獲得瞭空前成功,很快成為java訪問數據庫的標準,JDBC獲得瞭幾乎所有數據庫廠商的支持。這種數據庫間的可移植性和Java一直高喊的口號Compile Once, Run everywhere遙相呼應。Java能有今天這麼風光,JDBC可以說是功不可末。瞭。在沒有JDBC的時候,各傢數據庫廠商都有自己的一套API,開發人員訪問數據庫非常困難,換個數據庫,應用程序的修改量極大。JDBC今天還是java訪問數據庫的基石,本文中討論的其他幾種模式說到底隻是更好的封裝瞭JDBC, 提供瞭更為上層的更為強大的接口而已。
JDBC實現數據庫訪問的方式是在業務方法中直接嵌入SQL語句,SQL語句是面向關系的,依賴於關系模型。所以JDBC方式的優點是簡單直接,特別是對於小型應用十分方便。
但是JDBC這種實現方式也給應用程序帶來以下缺點:
(1)、實現業務邏輯的代碼和數據庫訪問代碼摻雜在一起,使程序結構不清晰,可讀性差。
(2)、在程序代碼中嵌入面向關系的SQL語句,使開發人員不能完全運用面向對象的思維來編寫程序。
(3)、業務邏輯和關系數據模型綁定,如果關系數據發生變化,必須手工修改代碼中所有相關的SQL語句,這曾經瞭維護軟件的難度。
(4)、如果程序代碼中SQL語句包含語法錯誤,在編譯時不能檢查這種錯誤,隻有在運行時才能發現這種錯誤,這增加瞭調試程序的難度。
正是由於上述的缺點,為瞭使業務邏輯和數據訪問細節分離,出現瞭下面的幾種模式。
2、主動域對象模式
主動域對象是實體域對象的一種形式,它在實現中封裝瞭關系數據模型和數據訪問的細節。在 J2EE 架構中,EJB組件分為會話EJB和實體EJB。會話EJB通常實現業務邏輯,而實體EJB表示業務實體。實體EJB又分為兩種:由EJB本身管理持久化,即BMP(Bean-Managed Persistence);由EJB容器管理持久化,即CMP(Container-Managed Persistence)。BM P就是主動域對象模式的一個例子,BMP 表示由實體 EJB 自身管理數據訪問細節。
主動域對象模式有以下優點:
(1)、在實體域對象中封裝自身的數據訪問細節,過程域對象完全負責業務邏輯,使程序結構更加清晰。
(2)、如果關系數據模式發生變化,隻需要修改主動域對象的代碼,不需要修改過程域對象的業務方法。
主動域對象模式有以下缺點:
(1)、在實體域對象的實現中仍然包含SQL語句。
(2)、每個實體域對象都負責自身的數據訪問實現。把這一職責分散在多個對象中,這會導致實體域對象重復實現一些共同的數據訪問操作,從而造成重復編碼。
主動域對象本身位於業務邏輯層,因此采用主動域對象模式時,整個應用仍然是三層應用結構,並沒有從業務邏輯層分離出獨立的持久化層。
3.CMP模式
在J2EE架構中,CMP(Container-Managed Persistence)表示由EJB容器來管理實體EJB 的持久化,EJB容器封裝瞭對象-關系的映射及數據訪問細節。CMP 和ORM的相似之處在於,兩者都提供對象-關系映射服務,都把對象持久化的任務從業務邏輯中分離出來。區別在於CMP負責持久化實體EJB組件,而ORM負責持久化 POJO,它是普通的基於 Java Bean 形式的實體域對象。
CMP模式的優點在於:
(1)、他是基於EJB技術,是SUN J2EE體系的核心部分,獲得瞭業界的普遍支持,包括各大廠商和開源組織等。如果選擇它作企業級開發,技術支持會非常完備。
(2)、功能日趨完善,包括瞭完善的事務支持,EJBQL查詢語言,透明的分佈式訪問等等
CMP模式的缺點在於:
(1)、開發人員開發的實體必須遵守復雜的J2EE規范,而多少ORM中間件沒有類似要求。
(2)、實體域EJB隻能運行在EJB容器中,而POJO可以運行在任何一種Java環境中。
(3)、盡管按照J2EE的規范,EJB應該是一種可移植組件,實際應用時確受到很大限制。而ORM中間件就不存在這樣的問題。
4.ORM模式
ORM-Object/Relational Mapper,即“對象-關系型數據映射組件”。對於O/R,即 Object(對象)和 Relational(關系型數據),表示必須同時使用面向對象和關系型數據進行開發。建模領域中的 ORM 為 Object/Role Modeling(對象角色建模)。另外這裡是“O/R Mapper”而非“O/R Mapping”。相對來講,O/R Mapping 描述的是一種設計思想或者實現機制,而 O/R Mapper指以O/R原理設計的持久化框架(Framework),包括 O/R機制、SQL自生成、事務處理和Cache管理等。
一般把基於 Java Bean 形式的實體域對象稱為 POJO(Plain Old Java Object),意為又普通又古老的 Java 對象的意思。隨著各種 ORM 映射工具的日趨成熟和流行,POJO有重現光彩,它和基於 CMP 的實體 EJB 相比,既簡單又具有很高的可移植性,因此聯合使用ORM 映射工具和 POJO,已經成為一種越來越受歡迎的且用來取代 CMP 的持久化方案。POJO的缺點就是無法做遠程調用,不支持分佈式計算。
常用的ORM中間件有:Hibernate、Apache OJB、Cayenne、Jaxor、TopLink等。其中 Hibernate 的輕量級 ORM 模型逐步確立瞭在 Java ORM 架構中領導地位,甚至取代復雜而又繁瑣的 EJB 模型而成為事實上的 Java ORM 工業標準。而且其中的許多設計均被 J2EE 標準組織吸納而成為最新 EJB 3.0 規范的標準。
5.JDO模式
JDO是近幾年新興的數據持久性技術,Java Data Objects(JDO)是 SUN 公司制定的描述對象持久化語義的標準API。嚴格的說,