Java,Beans和關系數據庫的鏡像(1)

發表于:2007-07-14來源:作者:點擊數: 標簽:
Java ,Beans和關系數據庫的鏡像(1) · 摘要 JDK1.1包括了新的數據庫存取(JDBC)及組件(JavaBeans)的應用程序接口(APIs)。這兩個API結合在一起,可用來開發通用數據庫代碼。通過用唯一的一個類去存取任何一種JDBC數據庫(封裝于不同組件中的各個應用程序有著
Java,Beans和關系數據庫的鏡像(1)

· 摘要

JDK1.1包括了新的數據庫存取(JDBC)及組件(JavaBeans)的應用程序接口(APIs)。這兩個API結合在一起,可用來開發通用數據庫代碼。通過用唯一的一個類去存取任何一種JDBC數據庫(封裝于不同組件中的各個應用程序有著其具體的編碼),用戶就不必因為數據庫結構一點點的細小變化去修改數據庫編碼。

一個關系數據庫基本上包括一系列相互關連的表,在每一個表中存有一類與應用系統相關的數據。例如一個地址簿數據庫中,可能有關于人員、住址、電話號碼等方面的表。

在數據庫中,每一個這樣的實體將被作為一系列的字符串,整數及其它原始數據類型存貯起來。數據庫中,表的定義將描述每一種與實體相關的信息如何在一個表的字段中存儲。

例如,你可以在一個名為“人”的表中,有兩個字段別表示所存字符串為“姓”和“名”。每一張表應當有一個或幾個字段值作為標識,確保每條記錄的唯一性。

這些標識或“鍵”可以用來連接存在于不同表中的信息。例如你可以在“人員”表中,為每個人指定唯一的“人員號碼”的鍵值,并在“地址”表
中的相應字段中使用同一個鍵值。這樣,你可以通過對兩個表中的“人員號碼”字段值的匹配,使每一個人和他的地址關聯起來。

關系數據庫系統出現于七十年代,時至今日,它仍然是存儲巨量數據的主要方式。因而,Java軟件工具有必要具備處理關系數據庫的能力。

關系數據庫要想被某個Java應用程序利用,首先需要解決兩個問題。

第一:需要某些基礎的中間件來建立與數據庫的連接,向數據庫發出SQL查詢等等;
第二:操縱數據庫的處理結果要與操縱任何一種Java信息一樣方便——作為一個對象。前一個問題已被SUN及幾個數據庫產商解決;后一個問題
則有待我們進一步去探究。

在為普通的程序開發業務定義大量的APIs這項工作上,SUN一直保持著與許多軟件公司的合作關系。在JDK1.1APIs中,JDBC的API是最早建立起來的。而且,它已得

到了為數眾多的應用。這些應用中,有的是100%的純Java,有的則是Java和其它程序的混合體,如:用現有的ODBC數據源進行連接(參看圖1)。Java Soft已將一個

關于現有的JDBC驅動程序的介紹放在它的Web站點上(http://splash.javasoft.com/jdbc/jdbc.drivers.html)。

非常明顯,這些應用的優缺點取決于你的環境和設置,在此我不準備對它們的各種情況進行逐一論述。在下面的內容中,我們假定,在你的機器中已擁有某種Java

開發環境,并且你已正確地安裝并測試過某個JDBC驅動程序,或者運用過某種JDBC驅動程序及SUN的JDBC/ODBC橋。

· JDBCAPI

JDBCAPI作為一個單獨的Java包(或類庫,即java.sql)出現,包括有一系列的類。這些類提供了處理某個關系數據庫的中
間件。本質上講,它們使得你可以關聯某個數據庫,并向其發出查詢。你可以對這些查詢結果進行處理,檢索你數據庫的meta-信息(meta-information),并且處理

在此間可能發生的各種異常情況。

讓我們來看一個簡單的JDBC例子,看一看應用了JavaJDBC之后,查詢會得到怎樣的簡化。表1是一個極其簡單的數據庫。在清單1中的編碼是一段最簡單的對關系數據庫進行SQL查詢所需的Java語句。

人員#名姓
43674SandorSpruit
90329JohnDoe
65435DonaldDuck
Stringur1="jdbc:odbc:sample";
Stringquery="SELECT*FROMPERSON";
booleanmore;
try
{
Class.forName("sun.jdbc.odbc.jdbcOdbcDriver");
Connectioncon=DriverManager.getConnection(ur1,"sandor","guest");
Statementstmt=con.createStatement();
ResultSetrs=stmt.executeQuery(query);
While(more=rs,next())
{
intnumber=rs.getInt("PERSON#");
StringfirstName=rs.getString("FIRST_NAME");
StringlastName=rs.getString("LAST_NAME");
System.out.printIn(number+""+firstName+""+lastName);
}
rs.close();
stmt.close();
con.close();
}
catch(SQLExceptionex)
{
ex.printStackTrace();
}

· 清單1:一個應用了JDBC的SQL查詢

這段編碼的含義是:先裝入SUN的JDBC/ODBC驅動程序,然后與被jdbc:odbc:sample指定的數據庫建立起一個關聯,最后對該
數據庫進行一個簡單的SELECT查詢。如果沒有遇到查詢異常(SQLException),程序將循環地從結果集(ResultSet)中每次抽出一條
數據庫記錄,并將其顯示在屏幕上。好了,現在我們來看一看這段程序還有哪些不足?在清單1的這類程序中,存在著兩個根本性的錯誤:

1.這種編碼用到了數量眾多的數據庫meta-信息,而這些信息都只能手工編碼到程序中。當你想要取一個數值時,你必須提前知道你將取到的數值是一個整數、浮

點數、還是一個雙精度數。這將會使得編寫一個可以處理任何一個數據庫的類變得十分困難;并且每一個數據庫的細小調整都會逼你去仔細地檢查和修改程序。

2.數據庫中的信息總是作為一個單個的RecordSet(記錄集)實例來傳遞,而這種實例并不是一個真正的對象。RecordSet類(與其它的數據庫類封裝沒什么差別)更象

一個指針或游標,借助方法,它能夠提供存取數據信息的途徑。RecordSet中的實例實際上并不包括信息,它們僅僅表示獲得信息的方式
。這正說明了當你要調用另外的RecordSet方法去獲取某些真實的數據信息的時候,你必須通過RecordSet去做更多的工作(利用RecordSet.NEXT()去移動指針)。實際上,JDBC類的確僅僅傳遞這類聯系松散的字段。即使你完全了解數據庫的所有內部細節,這也沒有任何價值,因為在Java提供了存儲和處理信息的方法。

所以,理想的狀態是,有一種好的方法,能夠逐一地從數據庫中抽取記錄或字段(通過RecordSet),并且將取到的信息“填”入到新生成的對象之中。這一解決方式

的關鍵在于關系數據庫(RDB)和面向對象的數據模型(ODB)之間的相似性。RDB中的表和ODB中的類的作用很相似,而記錄和對象也有著某些相同的屬性。你可以

將記錄看作是用來初始化某個對象的數據元素的數據組。如果你已將記錄從數據庫中抽取出來,就必須調用類構造函數來生成上面所說的對象。若能夠將每一條記錄自動地傳到適當的構造函數中,就可以輕而易舉地由記錄來構造對象。

在開發一個小的應用程序時,有可能將每一個記錄傳遞給某個構造函數,以此來生成新的對象。你可以經常利用對象參照來操縱從數據庫中抽取的任何數據。因為

你通過RecordSet所得到的每一個對象最終都是java.lang.Object的擴充。你可以定義一個BibClass,使其具有各類的共同屬性,BigClass類操作將利用Javainstanc

eof算子來實時決定運行中所遇到的數據庫信息,并且通過一個大的switch選擇,跳到相應的程序段中。

你也可以定義一個相似的帶有多個構造函數的BigClass,每個構造函數有差別不太大的調用參數。你可以用BigClass(int,int),BigClass(int,float)等等,取

決于你從RecordSet中循環取出的數據的類型(這一方法當然將會包括許多冗余代碼)。然而,以上兩種方法都不能真正解決問題。因為記錄和構造函數在程序中的關系仍將是僵硬的。若想得到通用的數據庫編碼,必須自動地建立數據庫和構造函數二者的關聯。Java的性能對于此時的我們就如雪中送碳。清單2中的程序片段只需一個類名就可以建造一個Java類。這樣,我們就可以憑借類和表的名稱來識別那些可以處理從表中抽取出的記錄的構造函數。利用標準的JDBC類,可以容易地獲得

所有表的表名,在此,我們將要充分利用這個Java小技巧。只要簡單地為每個數據庫表開辟一個Java類,使類名和表名相互匹配,無論何時,每當從表中抽取出一條記錄的時候,通過將表名傳遞給Class.forName(),程序將自動生成一個對象。

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97