簡析J2EE應用程式資料庫類設計模式 (轉)

gugu99發表於2008-06-24
簡析J2EE應用程式資料庫類設計模式 (轉)[@more@]本文主要介紹一種相關類的設計。並介紹在中的具體實現,以及在事務處理方面的一些考慮。 


一、設計模式簡介 
  在開發J2EE應用時,通常是要找出應用程式中涉及到的各種資訊,比如一個公司的產品目錄,或一個網站的資訊,我們會將這些資訊放在資料庫裡。 


  在通常的設計中,我們要分析這些資料的屬性和關係,然後進行資料庫的邏輯設計,把各種資訊用不同的表來。比如,要開發一個圖書資訊查詢。可以建立下面兩個表來分別表示書和出版社。 


  table Book (ID, Name, ISBN, Author, PublisherID, Price, Volume) 


  table Publisher (ID, Name, Telephone, Address, Postcode) 


  表Book包含了ID,書名,書號,作者,出版社ID,價格,頁數。表Publisher包含ID,社名,電話,地址,郵編。這兩個表透過出版社ID相關。 


  下面我們來介紹一種資料庫相關類的設計的模式。 


  資料庫相關類可以分成實體類(Entity Class)和會話類(Session Class)。 


  實體類對應於一個表的記錄的封裝,也就是該類的一個例項對應於表中的一個記錄。而且,該類中的屬性和記錄中的欄位是一一對應的。 


  會話類對應於對一個表中的所有記錄的操作。比如增加一條記錄,刪除一條記錄,查詢記錄和一條記錄。 


  透過使用這種設計模式,使程式更加模組化,便於開發和維護。當然,也可以使用其他設計模式。 


二、程式實現 
  在具體實現上面的這種模式時,往往根據具體的應用程式來選用不同的技術來實現。看到上面的描述模式後,我們很容易就發現,可以用來實現(EJB分兩種,實體EJB和會話EJB)。 


  我們知道,EJB提出來的目的是用於提供一種分散式系統的開發。如果我們的應用程式是一個分散式的應用系統,那麼毫無疑問,使用EJB來實現能大大減輕的工作量。同時,透過使用EJB容器的一些高階特性,可以使應用程式更加可靠,擴充套件性也大大加強。這樣一來,開發人員就不必關心一些底層技術,比如事務處理,等各個方面,而是把重點放在怎樣實現業務邏輯上。但是我們應該注意,如果開發的應用不是分散式的情況下,那麼採用EJB有可能大大降低系統的。因為,EJB的開銷很大。 


  本文將探討在不利用EJB技術的情況下如何來實現上面介紹的這個模式。 


  下面以開發圖書資訊查詢系統為例。 


  1.實體類 


  如前面講到的,實體類的每個例項與表中一個記錄對應。這樣,實體類的屬性應該和表的每個欄位一一對應。必須注意的是,實體類的例項是每個記錄在中的對應,因此,在程式中對例項的操作並不馬上反應到資料庫的記錄中。 


  在該類中,只是對資料的包裝,因此,該類僅需要一些基本的方法,即setXX()和getXX()方法。 


  下面是一個實體類,是對Book表的封裝。 


  class Book{ 


   protected int  ID; 


   protected String Name; 


   protected String ISBN; 


   protected String Author; 


   protected int  PublisherID; 


   protected double Price; 


   protected int  Volume; 


   public void setID(int iID); 


   public int  getID(); 


   public void setName(String sName); 


   public String getName(); 


   public void setISBN(String sISBN); 


   public String getISBN(); 


   public void setAuthor(String sAuthor); 


   public String getAuthor(); 


   public void setPublisherID(int iID); 


   public int  getPublisherID(); 


   public void setPrice(double dPrice); 


   public double getPrice(); 


   public void setVolume(int iVolume); 


   public int  getVolume(); 


   public Book(int iID, String sName, String sISBN, int iPublisherID, double dPrice, int iVolume); 


  }; 


  同樣地可以對錶Publisher進行封裝。 


  2.會話類 


  會話類主要是對一個表進行處理。這些操作可以是在表中建立一條記錄,刪除一條記錄,更新一條記錄和查詢一條記錄。這些操作的結果是將表中的記錄和記憶體中的實體類的例項對應起來,或將例項與表中的記錄對應起來。 


  我們可以看一下對Book表的封裝。 


  class BookTable{ 


   void Add(Book book); 


   void Delete(Book book); 


   void Update(Book book); 


   Collection finyID(int iID); 


   Collection findbyXXXX(XX,XX); 


   Collection findbyPulisherName(String sPublisherName); 


  }; 


  上面的類的申明中,Add()用於將記憶體中的一個Book例項對映到資料庫中。Delete()用於刪除資料庫中的某一個記錄。Update()用於更新表中的一個記錄。而findbyXXXX()則對應於語句。 


  對於涉及到多個表操作時,可以有兩種方式。一種是象BookTable一樣,專門封裝一個類。另一個方法是,直接在BoolTable中寫一個findbyPublisherName()。這個方法設計成返回一個Book的集合。 


  上面只是簡單的介紹了怎樣實現實體類和會話類。在具體的應用中,還要考慮到資料庫操作的一致性。下面就介紹一下事務處理的相關內容。 


三、事務處理 
  為了確保對資料操作的完整和一致,在時要充分考慮到事務處理方面的問題。 


  1.中怎樣將多個語句組合成一個事務。 


  在JDBC中,開啟一個連線Connection時,預設是auto-commit模式,每個SQL語句都被當作一個事務,即每次一個語句,都會自動的得到事務確認。為了能將多個SQL語句組合成一個事務,要將auto-commit模式遮蔽掉。 


  在auto-commit模式遮蔽掉之後,如果不呼叫commit()方法,SQL語句不會得到事務確認。在最近一次commit()方法呼叫之後的所有SQL會在方法commit()呼叫時得到確認。 


  下面的程式碼是一個示範: 


  con.setAutoCommit(false); 


  PreparedStatement updateSales=con.prepareStatement("UPDATE COFFES SET SALES=? WHERE COF_NAME LIKE ?"); 


  updateSales.setInt(1,50); 


  updateSales.setString(2,"Colombian"); 


  updateSales.executeUpdate(); 


  PreparedStatement updateTotal=con.prepareStatement("UPDATE COFFEES SET TOTAL =TOTAL+ ? WHERE COD_NAME LIKE ?"); 


  updateTotal.setInt(1,50); 


  updateTotal.setString(2,"Colombian"); 


  updateTotal.executeUpdate(); 


  con.commit(0; 


  con.setAutoCommit(true); 


  2.J2EE中分散式事務處理 


  在J2EE中,程式裡可以使用JTA來呼叫底層的JTS( Transaction Service 提供者服務)來處理分散式的事務處理。另外,如果使用EJB,可以透過在描述中指定transaction的屬性來實現。 


  有關分散式事務處理的具體內容,請參見J2EE規範。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-1006063/,如需轉載,請註明出處,否則將追究法律責任。

相關文章