簡析J2EE應用程式資料庫類設計模式 (轉)
簡析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規範。
一、設計模式簡介
在開發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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Go Web 程式設計--應用資料庫GoWeb程式設計資料庫
- Go Web 程式設計入門--應用資料庫GoWeb程式設計資料庫
- 設計模式 | 簡單工廠模式及典型應用設計模式
- 明確應用程式型別與資料庫結構設計型別資料庫
- 實驗3 轉移指令跳轉原理及其簡單應用程式設計程式設計
- iOS和macOS應用程式本地資料庫金鑰處理設計iOSMac資料庫
- 用OMF來簡化資料庫管理(轉)資料庫
- 如何在程式碼中應用設計模式設計模式
- J2EE模式-控制反轉模式
- 資料庫實驗五:資料庫程式設計資料庫程式設計
- 資料庫實驗八 資料庫程式設計資料庫程式設計
- 【資料庫設計】資料庫的設計資料庫
- 42. 資料庫程式設計資料庫程式設計
- Python SQLite資料庫程式設計PythonSQLite資料庫程式設計
- 設計模式 | 策略模式及典型應用設計模式
- 簡化stream流等工具類(函數語言程式設計的應用案例)函數程式設計
- 【web】資料庫應用系統設計體系結構Web資料庫
- 應用健康度隱患刨析解決系列之資料庫時區設定資料庫
- 設計模式應用舉例設計模式
- javascript設計模式與應用JavaScript設計模式
- 好程式設計師大資料培訓分享之MySQL資料庫SQL簡介程式設計師大資料MySql資料庫
- Go Web 程式設計之 資料庫GoWeb程式設計資料庫
- 抽獎小程式資料庫設計資料庫
- 好程式設計師大資料培訓分享大資料的應用程式設計師大資料
- 網路程式設計:C++REST SDK簡析程式設計C++REST
- 常用設計模式之白話精簡理解及應用-上設計模式
- 常用設計模式之白話精簡理解及應用-下設計模式
- 設計模式 | 中介者模式及典型應用設計模式
- 設計模式 | 外觀模式及典型應用設計模式
- 設計模式 | 模板方法模式及典型應用設計模式
- 設計模式 | 組合模式及典型應用設計模式
- 設計模式 | 享元模式及典型應用設計模式
- 【程式碼簡述設計模式】----- 觀察者模式設計模式
- 資料庫設計三大正規化應用例項剖析資料庫
- 程式設計面試題:編寫一個會造成資料庫死鎖的應用程式設計面試題資料庫
- 簡單的BBS論壇 資料庫設計資料庫
- Flux模式簡析UX模式
- 設計模式及其在spring中的應用(含程式碼)設計模式Spring
- 談反應式程式設計在服務端中的應用,資料庫操作優化,提速 Upsert程式設計服務端資料庫優化