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

發表于:2007-07-14來源:作者:點擊數: 標簽:
Java,Beans和關系數據庫的鏡像(2) Classc=class.forName(Person); Personp=(Person)c.newInstance(); System。out.println(...justcreateda+c.getName(); · 清單2:一個簡單的Class.forName()例子 然而,此處還有一些問題。由于對某些特定的類來說,forNa
Java,Beans和關系數據庫的鏡像(2)

Classc=class.forName("Person");
Personp=(Person)c.newInstance();
System。out.println("...justcreateda"+c.getName();

· 清單2:一個簡單的Class.forName()例子

然而,此處還有一些問題。由于對某些特定的類來說,forName()函數需要調用參數為void的構造函數,所以不能將RecordSet變量直接傳遞給構造函數。在這里,我們需要一個初始化函數,把從數據庫中抽取出的記錄作為RESULTSET參數,將其值賦予對象的數據元素。一個好的方法是引入超級類,并將其作為所有數據庫表相關類的通用父類。實際上,這個超級類在數據庫查詢中充當著重要的角色,我們將在下面展示這一點。

查詢數據庫利用上面的方法可以由記錄生成對象,但是你仍然得用SQL語句來查詢數據庫,這需要對數據庫結構有深入的了解。這還是沒有解決問題,雖然我們能夠自動地匹配數據庫表和類的名字,但是還是必須手工編寫SQL語句。這就是說每次修改數據庫結構后,將不得不手工編輯這些查詢語句。不過,我們仍然可以利用前文所述的方法來越過這個障礙。通常而言,查詢關系數據庫時,你將會用到屬于主鍵或索引的字段名和值。一言弊之,如果某人向你提供了適當的字段名和字段值

,你就可以從相應的數據庫中抽取符合要求的記錄(或字段)。而DatabaseMetaData對象不但可以被用于檢索一系列的表名(見上所述),而且可以獲得一系列的主鍵及索引字段。上面的問題由此可以迎刃而解。

通過填入一系列適當的(字段名,字段值)對,可以利用相對而言少得多的代碼實現對關系數據庫的查詢。你可以將對子中的所有字段名和數據庫中的主健及索引字段相匹配。每當你找到了名字列表中相應的主健或索引字段,可以根據相應的數值來生成一個SQL語句,執行它來獲取RecordSet,并通過Class.forName()構造機

制將結果轉化為對象。實現這一想法要求可以以(名,值)對的方式對與數據庫表相關的每個類的數據元素進行存取。但是這種方法只有通過上節所述的通用父類才能趨于完美。清單3和4利用偽碼表示了這一方法。

Openthedatabaseconnection
Retrievealistofuserdefinedtables
foreachtable
{
Checkwherethereisacorrespondingclassfile
if(itisavailabe)
{
loadtheclassfile
Retrievelistsofkeyfieldsandindecesforthistable
Storetheselistsinhashtablesforeasyaclearcase/" target="_blank" >ccess
}
elsethrowanexception
}

· 清單3:初始化數據庫連接的偽碼

TakeanobjectAcontainingaseriesof(name,value)pairs
foreachtableT
{
foreach(name,value)pair
{
if(namematchesprimary_key_fieldorindex_field)
storearefrencetobothnameandvalue
}
ifallkey_fieldswerefound
createaquerystringusingkeynamesandvalues
elseifallindex_fieldswerefound
createaquerystringusingindexnamesandvalues
executethequerytoobtainaResultSet
ForeachrecordintheResultSet
{
CreateanobjectoftheclassassociatedwithtableT
initializetheobjectusingtherecord''scontents
Addtheobjecttotheresults,e。g。,attachittoA
}
}

· 清單4:描述數據庫查詢的偽碼

Java鏡像和JavabeansJava1.1開發套件(JDK)的引入,為我們帶來了許多強大的新性能,例如全新的用戶界面接口類。有兩個新的JDKAPI尤其值得注意:鏡像機制(java.lang.reflect包)和JavaBeans組件的應用程序接口(java.beans包)。這兩個API將會幫助我們創建高明的數據庫類,使我們可以利用有關類的meta-信息,以此來解決開發通用數據庫類中的問題。

擁有forName()和newInstance()方法的Class類,僅僅是鏡象(reflection)功能的一個簡單例子。真正重要的是,forName()字符串參數不必須是源程序中出現的字符串。只要給出一個名字(這個名字可從任何地方取來),你就可以載入并實例化任何一個類。對于我們的數據庫類,我們可以直接從數據庫自身的表名中得到類名。這就是說,與數據庫表相關的Java類名并不需要出現在源程序中。相應地,當表名改變或某個表被加入到數據庫中時,不需要修改源碼,只要確信帶有新名字的類已存在你的系統中。

鏡像類意味著可以在實時運行中獲取、存儲和處理Java程序中的類信息。它們的實例能夠象任何Java對象一樣被運用,你可以象修改字符串和整數一樣,去修改類、數據類型、返回類型、方法參照和參數。在源程序級,這個鏡像的概念看起來并沒有什么價值——因為可以應用你自己的編碼直接存取你所需要的有關類、方法及參數的所有信息。但是,鏡像(reflection)將會在java的編譯文件中發揮作用。JavaBeansAPI的作用是:通過應用程序的構造機制利用來自于全然不同的開發者或產商所編寫的類。

JavaBeans規范為類成員的名字制定一系列的條例。以確保方法函數的名字能系統地描述它們的功能。任何一個符合規則的Java類都可以被一個Bean的內化實例(通過鏡像)檢查,以揭示其行為的重要特征——諸如對于什么樣的事件類將有所響應,以及該類將會產生什么樣的事件等等。任何符合這些規范的類都是高效的Bean,因而是一個組件。在理論上,這意味著你可以從各種來源收集一系列beans,當需要它們時可以將其其實時地綁在一起。一個Bean的例子

在下面一個名為Translation的Bean中,有一個構造函數和兩個方法來操作一個名為“language”的屬性。這里我想強調的是,既然你可以通過檢查一個類的代碼來了解它的構造函數、方法及屬性,那么Bean的內化器(Introspector)也能做到。

publicclassTranslationextendsObject
{
intlanguage;
publictranslation()
{
}
publicintgetlanguage()
{
return(language);
}
publicvoidsetLanguage(intlanguage)
{
this。language=language;
}
}

· 清單5:一個非常簡單的Bean

一個BeanIntrospector能夠提供許多數組的PropertyDescriptor實例,這些實例包含所有Bean的屬性的類型信息,即例子中由get/set方法所定義的類型。你可以調用這些方法(利用reflection)來讀或寫這些屬性。

鏡像機制(reflectionfacilities)為我們檢查原本松散的類和數據庫表的完整性提供了的更好方法。實際上,僅僅通過類名和一個表匹配并不一定能夠保證一些類內部的一致性。一個與表相關的類顯然應當具備存儲數據庫表中所有字段的數據元素。一個類可能有適當的名字,但其初始化代碼可能會省略。它可能只有一個正

確的名字,而其數據成員可能有不同的名字或者是不同的類型。使用JDBC的DatabaseMetaData及鏡像機制可以檢查它們是否完全匹配!引用一些JDBC調用去獲得現實中必須的數據庫信息,通過正確的名字去檢查你系統中的類,并且通過鏡像去比較表和類的屬性,這實實在在是一塊香餅!結論和啟示JDBC,鏡像和JavaBeans三者的結合,能夠方便地從關系數據庫中存取記錄并利用記錄來初始化組件(不僅僅是對象)。

為了實現上述操作,無需修改你的數據庫,只需確認你的類符合Bean規范,并使類屬性和表字段相互匹配。Beans還有其它一些簡單的技巧,可使編程更加有趣。Be

ans能夠提供自己的用戶界面組件,并且Beans規范還包括一個名為Customizers的東西。你可以引入另外的類專門地去察看、編輯和自行定制一個Bean類的實例。(關于定制Beans,請參看下一期《定制你的Java》

· 總之

我們可以為數據庫類編寫自行定義的類,應用程序能夠從關系數據庫中抽取數據,通過實例化某個類得到新的實例,并引入相關的圖形用戶界面(GUI)組件來查看和編輯數據。所有這些都由通用代碼完成,因而能夠處理任何數據庫。利用Java編寫的、功能齊全的數據庫查看/編輯器正迎我們而來。

張智雄編譯

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

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