Hibernate的工作方式:
Hibernate不會(huì)對(duì)您造成妨礙,也不會(huì)強(qiáng)迫您修改對(duì)象的行為方式。它們不需要實(shí)現(xiàn)任何不可思議的接口以便能夠持續(xù)存在。惟一需要做的就是創(chuàng)建一份 XML“映射文檔”,告訴Hibernate您希望能夠保存在數(shù)據(jù)庫(kù)中的類(lèi),以及它們?nèi)绾侮P(guān)聯(lián)到該數(shù)據(jù)庫(kù)中的表和列,然后就可以要求它以對(duì)象的形式獲取數(shù)據(jù),或者把對(duì)象保存為數(shù)據(jù)。與其他解決方案相比,它幾乎已經(jīng)很完美了。
由于本文只是一篇介紹性的文章,所以不會(huì)引入構(gòu)建和使用Hibernate映射文檔的具體例子(我在《Hibernate: A Developer's Notebook》一書(shū)的頭幾章中已經(jīng)介紹了一個(gè)例子)。此外,在網(wǎng)上和Hibernate的在線文檔中,還可以找到一些不錯(cuò)的例子,請(qǐng)參見(jiàn)下面的“其他信息”部分。它實(shí)際上相當(dāng)直觀。應(yīng)用程序?qū)ο笾械膶傩砸砸环N簡(jiǎn)單而自然的方式與正確的數(shù)據(jù)庫(kù)結(jié)構(gòu)相關(guān)聯(lián)。
運(yùn)行時(shí),Hibernate讀取映射文檔,然后動(dòng)態(tài)構(gòu)建Java類(lèi),以便管理數(shù)據(jù)庫(kù)與Java之間的轉(zhuǎn)換。在 Hibernate中有一個(gè)簡(jiǎn)單而直觀的API,用于對(duì)數(shù)據(jù)庫(kù)所表示的對(duì)象執(zhí)行查詢。要修改這些對(duì)象,(一般情況下)只需在程序中與它們進(jìn)行交互,然后告訴Hibernate保存修改即可。類(lèi)似地,創(chuàng)建新對(duì)象也很簡(jiǎn)單;只需以常規(guī)方式創(chuàng)建它們,然后告訴Hibernate有關(guān)它們的信息,這樣就能在數(shù)據(jù)庫(kù)中保存它們。
Hibernate API學(xué)習(xí)起來(lái)很簡(jiǎn)單,而且它與程序流的交互相當(dāng)自然。在適當(dāng)?shù)奈恢谜{(diào)用它,就可以達(dá)成目的。它帶來(lái)了很多自動(dòng)化和代碼節(jié)省方面的好處,所以花一點(diǎn)時(shí)間學(xué)習(xí)它是值得的。而且還可以獲得另一個(gè)好處,即代碼不用關(guān)心要使用的數(shù)據(jù)庫(kù)種類(lèi)(否則的話甚至必須知道)。我所在的公司就曾有過(guò)在開(kāi)發(fā)過(guò)程后期被迫更換數(shù)據(jù)庫(kù)廠商的經(jīng)歷。這會(huì)造成巨大的災(zāi)難,但是借助于Hibernate,只需要簡(jiǎn)單地修改Hibernate配置文件即可。
這里的討論假定您已經(jīng)通過(guò)創(chuàng)建Hibernate映射文檔,建立了一個(gè)關(guān)系數(shù)據(jù)庫(kù),并且擁有要映射的Java 類(lèi)。有一個(gè)Hibernate“工具集”可在編譯時(shí)使用,以支持不同的工作流。例如,如果您已經(jīng)擁有Java類(lèi)和映射文檔,Hibernate可以為您創(chuàng)建(或更新)必需的數(shù)據(jù)庫(kù)表;蛘,僅僅從映射文檔開(kāi)始,Hibernate也能夠生成數(shù)據(jù)類(lèi)。或者,它可以反向設(shè)計(jì)您的數(shù)據(jù)庫(kù)和類(lèi),從而擬定映射文檔。還有一些用于Eclipse的alpha 插件,它們可以在IDE中提供智能的編輯支持以及對(duì)這些工具的圖形訪問(wèn)。
使用Hibernate的場(chǎng)合
既然Hibernate看起來(lái)如此靈活好用,為什么還要使用其他的工具呢?下面有一些場(chǎng)景,可以幫助您做出判斷(或許通過(guò)提供一些比較和上下文,可以有助于鑒別非常適用Hibernate的場(chǎng)合)。
如果應(yīng)用對(duì)于數(shù)據(jù)存儲(chǔ)的需要十分簡(jiǎn)單——例如,您只想管理一組用戶優(yōu)先選擇——您根本不需要數(shù)據(jù)庫(kù),更不用說(shuō)一個(gè)優(yōu)秀的對(duì)象-關(guān)系映射系統(tǒng)了(即使它也如Hibernate這般易于使用)!從Java 1.4開(kāi)始,有一個(gè)標(biāo)準(zhǔn)的Java Preferences API可以很好地發(fā)揮這個(gè)作用。
對(duì)于熟悉使用關(guān)系數(shù)據(jù)庫(kù)和了解如何執(zhí)行完美的SQL查詢與企業(yè)數(shù)據(jù)庫(kù)交互的人來(lái)說(shuō),Hibernate似乎有些礙手礙腳,這就像帶有動(dòng)力和自動(dòng)排擋的快艇車(chē)會(huì)使注重性能的賽車(chē)駕駛員不耐煩一樣。如果您屬于這種人,如果您所在的項(xiàng)目團(tuán)隊(duì)擁有一個(gè)強(qiáng)大的DBA,或者有一些存儲(chǔ)過(guò)程要處理,您可能想研究一下iBATIS。Hibernate的創(chuàng)建者本身就把iBATIS當(dāng)作是另一種有趣的選擇。我對(duì)它很有興趣,因?yàn)槲覀冊(cè)鵀橐粋(gè)電子商務(wù)站點(diǎn)開(kāi)發(fā)了一個(gè)類(lèi)似的系統(tǒng)(其功能更為強(qiáng)大),而且從那時(shí)到現(xiàn)在,我們已經(jīng)在其他環(huán)境中使用過(guò)它,盡管在發(fā)現(xiàn)Hibernate之后,在新項(xiàng)目中我們通常更喜歡使用Hibernate。您可以認(rèn)為,以SQL為中心的解決方案(比如iBATIS)是“反向的”對(duì)象/關(guān)系映射工具,而 Hibernate是一個(gè)更為傳統(tǒng)的ORM。
當(dāng)然,還有其他的外部原因會(huì)導(dǎo)致采用另外的方法。比如,在一個(gè)企業(yè)環(huán)境中,必須使用成熟的EJB架構(gòu)(或者其他的一些非普通對(duì)象映射系統(tǒng))?梢詾樘峁┳约旱臄(shù)據(jù)存儲(chǔ)工具的平臺(tái)量身定做代碼,比如Mac OS X's Core Data。使用的可能是像XML DTD這樣的存儲(chǔ)規(guī)范,而它根本不涉及關(guān)系數(shù)據(jù)庫(kù)。
但是,如果您使用的是富對(duì)象模型,而且想要靈活、輕松且高效地保存它(無(wú)論您是否正要開(kāi)始或已經(jīng)決定使用關(guān)系數(shù)據(jù)庫(kù),只要這是一個(gè)選擇——而且存在可用的優(yōu)秀免費(fèi)數(shù)據(jù)庫(kù),比如MySQL,或可嵌入Java的HSQLDB,它就應(yīng)該始終是一個(gè)選擇),那么 Hibernate很可能就是您理想的選擇。您可能會(huì)驚訝于節(jié)省的時(shí)間之多,以及您將會(huì)多么地喜歡使用它。
Swing
圖形用戶接口(GUI)庫(kù)最初的設(shè)計(jì)目的是讓程序員構(gòu)建一個(gè)通用的GUI,使其在所有的平臺(tái)上都能夠正常的顯示。但是比較遺憾的是AWT產(chǎn)生的是在各系統(tǒng)看來(lái)都同樣欠佳的圖形用戶接口,JAVA1.2為老的java1.0 AWT添加了Java基礎(chǔ)類(lèi)(JFC),這是一個(gè)被稱(chēng)為“Swing”的GUI的一部分。Swing是第二代GUI開(kāi)發(fā)工具集,AWT采用了與特定平臺(tái)相關(guān)的實(shí)現(xiàn),而絕大部分Swing組件卻不是。Swing是構(gòu)筑在AWT上層的一組GUI組件的集合,為了保證可移植性,它完全用Java語(yǔ)言編寫(xiě),與AWT相比,Swing提供了更完整的組件,引入了許多新的特性和能力。Swing提供了更多的組件庫(kù),如:JTable,JTree,Jcombox。Swing也增強(qiáng)了AWT中組件的功能。正是因?yàn)镾wing具備了如此多的優(yōu)勢(shì)所以我們以后在開(kāi)發(fā)中都使用Swing。JComponent類(lèi)是Swing組件的基類(lèi),而JComponent繼承自Container類(lèi),因此,所有的Swing組件都是AWT的容器。Swing采用了MVC設(shè)計(jì)模式。
相關(guān)推薦:2010年下半年軟考成績(jī)查詢時(shí)間及方式匯總
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |