程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA編程入門知識 >> Java模式設計之數據訪問對象模式

Java模式設計之數據訪問對象模式

編輯:JAVA編程入門知識
  很多的J2EE應用程序需要使用持久性數據(數據庫、文件等)。不同的程序,持久性存儲是各不相同的,並且用來訪問這些不同的持久性存儲機制的API也有很大的不同。假如應用程序要在不同的持久性存儲間遷移,這些訪問特定持久存儲層的代碼將面臨重寫。
  
   <!-- frame contents --> <!-- /frame contents -->   如何解決這個問題?且看"DAO模式"
  
  數據訪問對象(Data Acess Object) 模式
  
  一.環境
  
  根據數據源不同,數據訪問也不同。根據存儲的類型(關系數據庫、面向對象數據庫、文件等等)和供給商實現不同,持久性存儲(比如數據庫)的訪問差別也很大。
   
  二.問題
  
  許多真是的J2EE應用程序需要在一定程度上使用持久性數據。對於許多應用程序,持久性存儲是使用不同的機制實現的,並且用來訪問這些不同的持久性存儲機制的API也有很大的不同。
  
  比如,應用程序使用實體bean(這裡應該是指BMP的bean,CMP的bean已大大降低了與RDBMS的耦合)的分布式組件來表示持久性數據,或者使用JDBC API來訪問駐留在某關系數據庫治理系統(RDBMS)中的數據,這些組件中包含連接性性和數據訪問代碼會引入這些組件與數據源實現之間的緊密耦合。組件中這類代碼依靠性使應用程序從某種數據源遷移到其他種類的數據源將變得非常麻煩和困難。當數據源變化時,組件也需要改變,以便於能夠處理新類型的數據源。
  
  (舉個例子來說,我們UPTEL系統是使用JDBC API對 Oracle數據庫進行連接和數據訪問的,這些JDBC API與SQL語句散布在系統中,當我們需要將UPTEL遷移到其他RDBMS時,比如曾經遷移到INFORMIX,就面臨重寫數據庫連接和訪問數據的模塊。)
  
  三.作用力
  
  1.諸如bean治理的實體bean、會話bean、servlet等組件往往需要從持久性存儲數據源中檢索數據,以及進行數據存儲等操作。
  
  2.根據產品供給商的不同,持久性存儲API差別也很大,這些API和其能力同樣根據存儲的類型不同也有差別,這樣存在以下缺點,即訪問這些獨立系統的API很不統一。
  
  3.組件需要透明於實際的持久性存儲或者數據源實現,以便於提供到不同供給商產品、不同存儲類型和不同數據源類型的更輕易的移植性。
  四.解決方案
  
  使用數據訪問對象(DAO)模式來抽象和封裝所有對數據源的訪問。DAO治理著與數據源的連接以便檢索和存儲數據。
  
   <!-- frame contents --> <!-- /frame contents -->   DAO實現了用來操作數據源的訪問機制。數據源可以時RDBMS,LDAP,File等。依靠於DAO的業務組件為其客戶端使用DAO提供更簡單的接口。DAO完全向客戶端隱藏了數據源實現細節。由於當低層數據源實現變化時,DAO向客戶端提供的接口不會變化,所有該模式答應DAO調整到不同的存儲模式,而不會影響其客戶端或者業務組件。重要的是,DAO充當組件和數據源之間的適配器。
  
  (按照這個理論,假如我們UPTEL系統使用了DAO模式,就可以無縫的從ORACLE遷移到任何一個RDBMS了。夢想總是很完美的,且看看DAO模式如何實現)
  
  1.結構,圖1是表示DAO模式中各種關系的類圖。
  
  此主題相關圖片如下:
  
  <iframe src="/uploadImages/2007-5-2/20075212414841207.jpg" frameBorder=0 width=590 scrolling=yes height=349></iframe>
  (圖片較大,請拉動滾動條觀看)
  
  2.參與者和職責
  
  1)BusinessObject(業務對象)
  
  代表數據客戶端。正是該對象需要訪問數據源以獲取和存儲數據。
  
  2)DataAccessObject(數據訪問對象)
  
  是該模式的主要對象。DataAccessObject抽取該BusinessObject的低層數據訪問實現,以保證對數據源的透明訪問。BusinessObject也可以把數據加載和存儲操作委托給DataAccessObject。
  
  3)DataSource(數據源)
  
  代表數據源實現。數據源可以是各RDBMSR數據庫,OODBMS,XML文件等等。
  
  4)valueObject(值對象)
  
  代表用做數據攜帶著的值對象。DataAccessObject可以使用值對象來把數據返回給客戶端。
  
  DataAccessObject也許會接受來自於客戶端的數據,其中這些用於更新數據源的數據存放於值對象中來傳遞。
  
  3.策略
  
  1).自動DAO代碼產生策略
  
  因為每個BusinessObject對應於一個非凡的DAO,因此有可能建立BusinessObject,DAO和低層實現(比如RDBMS中的表)之間的關系(映射)。一點這些關系(映射)已經建立,我們就可以編寫與應用程序有館的代碼生成的簡單工具了(什麼?自己寫GP程序?用ORM的附帶工具自動生成不就完了,最多自己寫幾個Adapter,牛人就是不同,啥都要自己寫...),其中的工具可以產生該應用程序需要的所有DAO代碼。
  
  假如DAO需求很復雜,我們可以采用第三方工具,其中這些工具提供對象到RDBMS數據庫的關系映射(這裡指的是前面提到的ORM工具,全稱是Object Relation Mapping,目前成熟的ORM工具有很多:Hibernate,OJB,Torque,TopLink等等)。
  
  這些工具通常包含GUI工具來把業務對象映射到持久性存儲對象,並且因而定義中間DAO。一旦這些映射完成,這些工具會自動地生成代碼,並且也許會提供其他增值功能,比如結果緩沖、查詢緩沖、與應用程序集成,以及與其他第三方產品(比如分布式緩沖)地繼續,等等。
  
  (增值服務:Torque提供了結果緩沖,Hibernate提供了對Oracle數據庫SQL指令的優化,OJB提供JDO API、OMDB API)
  
  2).數據訪問對象的工廠策略
  
  通過調整抽象工廠和工廠方法模式,DAO模式可以達到很高的靈活度。
  
  當低層存儲不會隨著實現變化而變化時,該策略可以使用工廠方法模式來實現該策略。以產生應用程序需要的大量DAO。圖2是這種情況下的類圖。
  
  此主題相關圖片如下:
  
  
  
  當低層存儲隨著實現變化而變化時,該策略可以使用抽象工廠方法模式而實現。
  
  圖3是這種情況下的類圖。
  
  此主題相關圖片如下:
  
  <iframe src="/uploadImages/2007-5-2/20075212414948895.jpg" frameBorder=0 width=590 scrolling=yes height=400></iframe>
  (圖片較大,請拉動滾動條觀看)
  5.結果
  
  1).啟用透明性
  
  業務對象可以是使用數據源,而無須了解該數據源實現的具體細節。訪問是透明的,原因是實現被隱藏在DAO的內部。
   
  2).啟用更輕易的遷移
  
  
 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved