国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
Java數(shù)據(jù)訪問對象(DAO)編程模入門
J2EE開發(fā)人員使用數(shù)據(jù)訪問對象(DAO)設計模式把底層的數(shù)據(jù)訪問邏輯和高層的商務邏輯分開。實現(xiàn)DAO模式能夠更加專注于編寫數(shù)據(jù)訪問代碼。這篇文章中,Java開發(fā)人員Sean C. Sullivan從三個方面討論DAO編程的結(jié)構(gòu)特征:事務劃分,異常處理,日志記錄。
  
  在最近的18個月,我和一個優(yōu)秀的軟件開發(fā)團隊一起工作,開發(fā)定制基于WEB的供應鏈管理應用程序.我們的應用程序訪問廣泛的持久層數(shù)據(jù),包括出貨狀態(tài),供應鏈制度,庫存,貨物發(fā)運,項目管理數(shù)據(jù),和用戶屬性等.我們使用JDBC API連接我們公司的各種數(shù)據(jù)庫平臺,并且在整個應用程序中應用了DAO設計模式.
  
  通過在整個應用程序中應用數(shù)據(jù)訪問對象(DAO)設計模式使我們能夠把底層的數(shù)據(jù)訪問邏輯和上層的商務邏輯分開.我們?yōu)槊總€數(shù)據(jù)源創(chuàng)建了提供CRUD(創(chuàng)建,讀取,更新,刪除)操作的DAO類.
  
  在本文中,我將向你介紹DAO的實現(xiàn)策略以及創(chuàng)建更好的DAO類的技術.我會明確的介紹日志記錄,異常處理,和事務劃分三項技術.你將學在你的DAO類中怎樣把這三種技術結(jié)合在一起.這篇文章假設你熟悉JDBC API,SQL和關系性數(shù)據(jù)庫編程.
  
  我們先來回顧一下DAO設計模式和數(shù)據(jù)訪問對象.
  
  DAO基礎
  
  DAO模式是標準的J2EE設計模式之一.開發(fā)人員使用這個模式把底層的數(shù)據(jù)訪問操作和上層的商務邏輯分開.一個典型的DAO實現(xiàn)有下列幾個組件:
  
  1. 一個DAO工廠類;
  
  2. 一個DAO接口;
  
  3. 一個實現(xiàn)DAO接口的具體類;
  
  4. 數(shù)據(jù)傳遞對象(有些時候叫做值對象).
  
  具體的DAO類包含了從特定的數(shù)據(jù)源訪問數(shù)據(jù)的邏輯。在下面的這段中你將學到設計和實現(xiàn)數(shù)據(jù)訪問對象的技術。
  
  事務劃分:
  
  關于DAO要記住的一件重要事情是它們是事務性對象。每個被DAO執(zhí)行的操作(象創(chuàng)建,更新、或刪除數(shù)據(jù))都是和事務相關聯(lián)的。同樣的,事務劃分(transaction demarcation)的概念是特別重要的。
  
  事務劃分是在事務界定定義中的方式。J2EE規(guī)范為事務劃分描述了兩種模式:編程性事務(programmatic)和聲明性事務(declarative)。下表是對這兩種模式的拆分:
   

  我將把注意力集中的編程性事務劃分上。
  
  象前面的介紹一樣,DAOs是一些事務對象。一個典型的DAO要執(zhí)行象創(chuàng)建、更新、和刪除這的事務性操作。在設計一個DAO時,首先要問自己如下問題:
  
  1、 事務將怎樣開始?
  
  2、 事務將怎樣結(jié)束?
  
  3、 那個對象將承擔起動一個事務的責任?
  
  4、 那個對象將承擔結(jié)束一個事務的責任?
  
  5、 DAO應該承擔起動和結(jié)束事務的責任?
  
  6、 應用程序需要交叉訪問多個DAO嗎?
  
  7、 一個事務包含一個DAO還是多個DAO?
  
  8、 一個DAO包含其它的DAO中的方法嗎?
  
  回答這些問題將有助于你為DAO對象選擇最好的事務劃分策略。對ADO中的事務劃分有兩個主要的策略。一種方法是使用DAO承擔事務劃分的責任;另一種是延期性事務,它把事務劃分到調(diào)用DAO對象的方法中。如果你選擇前者,你將要在DAO類中嵌入事務代碼。如果你選擇后者,事務代碼將被寫在DAO類的外部。我們將使用簡單的代碼實例來更好的理解這兩種方法是怎樣工作的。
  
  實例1展示了一個帶有兩種數(shù)據(jù)操作的DAO:創(chuàng)建(create)和更新(update):
  
  public void createWarehouseProfile(WHProfile profile);
  public void updateWarehouseStatus(WHIdentifier id, StatusInfo status);
  
  實例2展示了一個簡單的事務,事務劃分代碼是在DAO類的外部。注意:在這個例子中的調(diào)用者把多個DOA操作組合到這個事務中。
  
  tx.begin(); // start the transaction
  dao.createWarehouseProfile(profile);
  dao.updateWarehouseStatus(id1, status1);
  dao.updateWarehouseStatus(id2, status2);
  tx.commit(); // end the transaction
  
  這種事務事務劃分策略對在一個單一事務中訪問多個DAO的應用程序來說尤為重要。
  
  你即可使用JDBC API也可以使用Java 事務API(JTA)來實現(xiàn)事務的劃分。JDBC事務劃分比JTA事務劃分簡單,但是JTA提供了更好的靈活性。在下面的這段中,我們會進一步的看事務劃分機制。
  
  使用JDBC的事務劃分
  
  JDBC事務是使用Connection對象來控制的。JDBC的連接接口(java.sql.Connection)提供了兩種事務模式:自動提交和手動提交。Java.sql.Connection為控制事務提供了下列方法:
  
  .public void setAutoCommit(Boolean)
  .public Boolean getAutoCommit()
  .public void commit()
  .public void rollback()
  
  實例3展示怎樣使用JDBC API來劃分事務:
  
  import java.sql.*;
  import javax.sql.*;
  // ...
  DataSource ds = obtainDataSource();
  Connection conn = ds.getConnection();
  conn.setAutoCommit(false);
  // ...
  pstmt = conn.prepareStatement(";UPDATE MOVIES ...";);
  pstmt.setString(1, ";The Great Escape";);
  pstmt.executeUpdate();
  // ...
  conn.commit();
  // ...
  
  使用JDBC事務劃分,你能夠把多個SQL語句組合到一個單一事務中。JDBC事務的缺點之一就是事務范圍被限定在一個單一的數(shù)據(jù)庫連接中。一個JDBC事務不能夠跨越多個數(shù)據(jù)庫。接下來,我們會看到怎樣使用JTA來做事務劃分的。因為JTA不象JDBC那樣被廣泛的了解,所以我首先概要的介紹一下JTA。
  
  JTA概要介紹
  
  Java事務API(JTA;Java Transaction API)和它的同胞Java事務服務(JTS;Java Transaction Service),為J2EE平臺提供了分布式事務服務。一個分布式事務(distributed transaction)包括一個事務管理器(transaction manager)和一個或多個資源管理器(resource manager)。一個資源管理器(resource manager)是任意類型的持久化數(shù)據(jù)存儲。事務管理器(transaction manager)承擔著所有事務參與單元者的相互通訊的責任。下車站顯示了事務管理器和資源管理的間的關系。
  
  JTA事務比JDBC事務更強大。一個JTA事務可以有多個參與者,而一個JDBC事務則被限定在一個單一的數(shù)據(jù)庫連接。下列任一個Java平臺的組件都可以參與到一個JTA事務中:
  
  .JDBC連接
  
  .JDO PersistenceManager 對象
  
  .JMS 隊列
  
  .JMS 主題
  
  .企業(yè)JavaBeans(EJB)
  
  .一個用J2EE Connector Architecture 規(guī)范編譯的資源分配器。
  
  使用JTA的事務劃分
  
  要用JTA來劃分一個事務,應用程序調(diào)用javax.transaction.UserTransaction接口中的方法。示例4顯示了一個典型的JNDI搜索的UseTransaction對象。
  
  import javax.transaction.*;
  import javax.naming.*;
  // ...
  InitialContext ctx = new InitialContext();
  Object txObj = ctx.lookup(";java:comp/UserTransaction";);
  UserTransaction utx = (UserTransaction) txObj;
  
  應用程序有了UserTransaction對象的引用之后,就可以象示例5那樣來起動事務。
  
  utx.begin();
  // ...
  DataSource ds = obtainXADataSource();
  Connection conn = ds.getConnection();
  pstmt = conn.prepareStatement(";UPDATE MOVIES ...";);
  pstmt.setString(1, ";Spinal Tap";);
  pstmt.executeUpdate();
  // ...
  utx.commit();
  // ...
  
  當應用程序調(diào)用commit()時,事務管理器使用兩段提交協(xié)議來結(jié)束事務。JTA事務控制的方法:
  
  .javax.transaction.UserTransaction接口提供了下列事務控制方法:
  
  .public void begin()
  .public void commit()
  .public void rollback()
  .public void getStatus()
  .public void setRollbackOnly()
  .public void setTransactionTimeout(int)
  
  應用程序調(diào)用begin()來起動事務,即可調(diào)用commit()也可以調(diào)用rollback()來結(jié)束事務。
  
  使用JTA和JDBC
  
  開發(fā)人員經(jīng)常使用JDBC來作為DAO類中的底層數(shù)據(jù)操作。如果計劃使用JTA來劃分事務,你將需要一個實現(xiàn)了javax.sql.XADataSource,javax.sql.XAConnection和javax.sql.XAResource接口JDBC的驅(qū)動。實現(xiàn)了這些接口的驅(qū)動將有能力參與到JTA事務中。一個XADataSource對象是一個XAConnection對象的工廠。XAConnections是參與到JTA事務中的連接。
  
  你需要使用應用程序服務器管理工具來建立XADataSource對象。對于特殊的指令請參考應用程序服務器文檔和JDBC驅(qū)動文檔。
  
  J2EE應用程序使用JNDI來查找數(shù)據(jù)源。一旦應用程序有了一個數(shù)據(jù)源對象的引用,這會調(diào)用javax.sql.DataSource.getConnection()來獲得數(shù)據(jù)庫的連接。
  
  XA連接區(qū)別于非XA連接。要記住的是XA連接是一個JTA事務中的參與者。這就意味著XA連接不支持JDBC的自動提交特性。也就是說應用程序不必在XA連接上調(diào)用java.sql.Connection.commit()或java.sql.Connection.rollback()。相反,應用程序應該使用UserTransaction.begin()、UserTransaction.commit()和UserTransaction.rollback().
  
  選擇最好的方法
  
  我們已經(jīng)討論了JDBC和JTA是怎樣劃分事務的。每一種方法都有它的優(yōu)點,回此你需要決定為你的應用程序選擇一個最適應的方法。 在我們團隊許多最近的對于事務劃分的項目中使用JDBC API來創(chuàng)建DAO類。這DAO類總結(jié)如下:
  
  .事務劃分代碼被嵌入到DAO類內(nèi)部
  
  .DAO類使用JDBC API來進行事務劃分
  
  .調(diào)用者沒有劃分事務的方法
  
  .事務范圍被限定在一個單一的JDBC連接
  
  JDBC事務對復雜的企業(yè)應用程序不總是有效的。如果你的事務將跨越多個DAO對象或多個數(shù)據(jù)庫,那么下面的實現(xiàn)策略可能會更恰當:
  
  .用JTA對事務進行劃分
  
  .事務劃分代碼被DAO分開
  
  .調(diào)用者承擔劃分事務的責任
  
  .DAO參與一個全局的事務中
  
  JDBC方法由于它的簡易性而具有吸引力,JTA方法提供了更多靈活性。你選擇什么樣的實現(xiàn)將依賴于你的應用程序的特定需求。
  
  日志記錄和DAO
  
  一個好的DAO實現(xiàn)類將使用日志記錄來捕獲有關它在運行時的行為細節(jié)。你可以選擇記錄異常、配置信息、連接狀態(tài)、JDBC驅(qū)動程序的元數(shù)據(jù)或查詢參數(shù)。日志對開發(fā)整個階段都是有益的。我經(jīng)常檢查應用程序在開發(fā)期間、測試期間和產(chǎn)品中的日志記錄。
  
  在這段中,我們將展現(xiàn)一段如何把Jakarta Commaons Logging結(jié)合中一個DAO中的例子。在我們開始之前,讓我們先回顧一些基礎知識。
  
  選擇一個日志例庫
  
  許多開發(fā)人員使用的基本日志形式是:System.out.println和System.err.println.Println語句。這種形式快捷方便,但它們不能提供一個完整的日志系統(tǒng)的的能力。下表列出了Java平臺的日志類庫:
   

  Java.util.logging是J2SE1.4平臺上的標準的API。但是,大多數(shù)開發(fā)人員都認為Jakarta Log4j提供了更大的功能性和靈活性。Log4j超越java.util.logging的優(yōu)點之一就是它支持J2SE1.3和J2SE1.4平臺。
  
  Jakarta Commons Logging能夠被用于和java.util.loggin或Jakarta Log4j一起工作。Commons Logging是一個把你的應用程序獨立于日志實現(xiàn)的提取層。使用Commons Logging你能夠通過改變一個配置文件來與下面的日志實現(xiàn)來交換數(shù)據(jù)。Commons Logging被用于JAKARTA Struts1.1和Jakarta HttpClient2.0中。
  
  一個日志示例
  
  示例7顯示了在一個DOA類中怎樣使用Jakarta Commons Logging
  
  import org.apache.commons.logging.*;
  class DocumentDAOImpl implements DocumentDAO
  {
  static private final Log log = LogFactory.getLog(DocumentDAOImpl.class);
  public void deleteDocument(String id)
  {
  // ...
  log.debug(";deleting document: "; + id);
  // ...
  try
  {
  // ... data operations ...
  }
  catch (SomeException ex)
  {
  log.error(";Unable to delete document"; ex);
  // ... handle the exception ...
  }
  }
  }
  
  日志是評估應用程序的基本部分。如果你在一個DAO中遇到了失敗,日志經(jīng)常會為理解發(fā)生的什么錯誤提供最好的信息。把日志結(jié)合到你的DAO中,確保得到調(diào)試和解決問題的有效手段。
  
  DAO中的異常處理
  
  我們已經(jīng)看了事務劃分和日志記錄,并且現(xiàn)在對于它們是怎樣應用于數(shù)據(jù)訪問對象的有一個深入的理解。我們第三部分也是最后要討論的是異常處理。下面的一些簡單的異常處理方針使用你的DAO更容易使用,更加健壯和更具有可維護性。
  
  在實現(xiàn)DAO模式的時候,要考濾下面的問題:
  
  .在DAO的public接口中的方法將拋出被檢查的異常嗎?
  
  .如果是,將拋出什么樣的檢查性異常?
  
  .在DAO實現(xiàn)類中怎能樣處理異常。
  
  在用DAO模式工作的過程中,我們的團隊為異常處理開發(fā)了一組方針。下面的這些方針會很大程度的改善你的DAO:
  
  .DAO方法應該拋出有意義的異常。
  
  .DAO方法不應該拋出java.lang.Exception異常。因為java.lang.Exception太一般化,它不能包含有關潛在問題的所有信息。
  
  .DAO方法不應該拋出java.sql.SQLException異常。SQLException是一個底層的JDBC異常,DAO應用努力封裝JDBC異常而不應該把JDBC異常留給應用程序的其它部分。
  
  .在DAO接口中的方法應該只拋出調(diào)用者期望處理的檢查性異常。如果調(diào)用者不能用適當?shù)姆椒▉硖幚懋惓#紴V拋出不檢查性(運行時run-time)異常。
  
  .如果你的數(shù)據(jù)訪問代碼捕獲了一個異常,不可要忽略它。忽略捕獲異常的DAO是很處理的。
  
  .使用異常鏈把底層的異常傳遞給高層的某個處理器。
  
  .考濾定義一個標準的DAO異常類。Spring框架提供了一個優(yōu)秀的預定義的DAO異常類的集合。
  
  看Resources,查看有異常和異常處理技術的更詳細信息。
  
  實現(xiàn)示例:MovieDAO
  
  MoveDAO是一個示范了在這篇文章中所討論的所有技術,包括事務劃分、日志記錄和異常處理。你會在Resources段找到MovieDAO的源代碼。它被分下面的三個包:
  
  .daoexamples.exception
  .daoexamples.move
  .daoexamples.moviedemo
  
  這個DAO模式的實現(xiàn)由下面的類和接口組成:
  
  .daoexamples.movie.MovieDAOFactory
  .daoexamples.movie.MovieDAO
  .daoexamples.movie.MovieDAOImpl
  .daoexamples.movie.MovieDAOImplJTA
  .daoexamples.movie.Movie
  .daoexamples.movie.MovieImple
  .daoexamples.movie.MovieNotFoundException
  .daoexamples.movie.MovieUtil
  
  MovieDAO接口定義了DAO的數(shù)據(jù)操作。這個接口有如下五個方法:
  
  .public Movie findMovieById(String id)
  .public java.util.Collection findMoviesByYear(String year)
  .public void deleteMovie(String id)
  .public Movie createMovie(String rating,String year,String title)
  .public void updateMovie(String id,String rating,String year,String title)
  
  daoexamples.movie包包含了兩個MovieDAO接口的實現(xiàn)。每個實現(xiàn)使用了一個同的事務劃分方法,如下表所示:
  

  
  MovieDAO 示范應用程序
  
  這個示范應用程序是一個叫做daoexamples.moviedemo.DemoServlet.DemoServlet的servlet類,它使用Movie DAO來查詢和更新一個表中的movie數(shù)據(jù)。
  
  這個servlet示范了把JTA感知的MovieDAO和Java消息服務組合到一個單一的事務中,如示例8所示:
  
  UserTransaction utx = MovieUtil.getUserTransaction();
  utx.begin();
  batman = dao.createMovie(";R";
  ";2008";
  ";Batman Reloaded";);
  publisher = new MessagePublisher();
  publisher.publishTextMessage(";I’ll be back";);
  dao.updateMovie(topgun.getId(),
  ";PG-13";
  topgun.getReleaseYear(),
  topgun.getTitle());
  dao.deleteMovie(legallyblonde.getId());
  utx.commit();
  
  要運行這個范例應用程序,在你的應用程序服務器中配置一個XA 數(shù)據(jù)源和一個非XA數(shù)據(jù)源。然后布署daoexamples.ear文件。這個應用程序?qū)⑦\行在任何與J2EE兼容的應用程序服務器。
本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
高級 DAO 編程
事務管理 Transaction Management
Hibernate的事務和并發(fā)控制
hibernate-事務管理
基于Spring框架的WebSphere應用開發(fā)
JTA初級研究之JTA和JDBC事務
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服