在企業(yè)開發(fā)過程中最頭痛的就是DA層(Data Access)的開發(fā)了,關(guān)系數(shù)據(jù)庫這個冬冬最討人嫌了,我就因?yàn)橛憛掙P(guān)系數(shù)據(jù)庫,大學(xué)有一段時間很討厭寫web程序。
這些問題主要都是因?yàn)橐郧岸际侵苯佑肧ql和數(shù)據(jù)庫打交道,每次web項(xiàng)目一把以上的時間花在了DA層了。工作后接觸的第一種DA技術(shù)是Spring support的DAO編寫,這樣就可以減少了很多的代碼,而且我還寫了一個代碼生成器來自動生成代碼,這樣開發(fā)速度就上來了,但是就算是這樣我們還是很煩惱,因?yàn)閱伪淼牟僮魇呛唵瘟耍嵌啾淼牟僮饕彩呛軣溃覀兪怯胘ava代碼建立了一個DBManger層專門用來組裝多表的,當(dāng)然很多人都是用sql進(jìn)行多表的拼裝,這樣運(yùn)行效率高,但是我們當(dāng)時是選擇了開發(fā)效率,所以多表都是在DBManager層用java代碼組裝的,沒有利用數(shù)據(jù)庫的特性,這樣增加了web服務(wù)器的負(fù)擔(dān)。而且在做查詢的時候特別苦惱,每次都是把整個List全部給load出來了,這樣更加耗費(fèi)內(nèi)存了。比如我們的訂單列表的功能現(xiàn)在還沒有多少個訂單的時候都慢得不行了,一個是因?yàn)槲覀兠看味糽oad所有的Order對象,二是把Order對象的子對象也全部都Load出來了,本來用戶只是想看其中幾個訂單而已,而且我們也沒有做緩存,總之我們原來項(xiàng)目里面的DA層真的是問題重重。
這兩天把Hibernate引入了我們現(xiàn)在新的項(xiàng)目中來了,開心啊,開心,給我們帶來了解決上述問題的曙光:
1、在開發(fā)效率上面,我們現(xiàn)在所有的工作就是建立數(shù)據(jù)表,根據(jù)數(shù)據(jù)表生成hbm.xml的表對應(yīng)Java bean的映射,以及生成java代碼。而DAO只是需要一行代碼。多表的聯(lián)合也是定義在hbm.xml中的,整個過程看不到一行sql語句,開心。這樣我們體系結(jié)構(gòu)里面的DBManager就沒有存在的必要了。而且DAO也只是需要做一個DAO,現(xiàn)在我們就只有Order的DAO了,所有的操作都在這里進(jìn)行。
2、運(yùn)行效率上,首先利用了延時加載,數(shù)據(jù)如果不用就不load出來,這樣我們的Web服務(wù)器就沒有那么大的負(fù)擔(dān)了,然后就是多表的操作自動生成多表聯(lián)合的Sql充分利用數(shù)據(jù)庫的特性,這樣也是減少web的負(fù)擔(dān)。
接著最重要的問題就是在做訂單列表的時候,這里真的要好好贊揚(yáng)一下HQL,這個Hibernate的查詢語言,用完全面向?qū)ο蟮姆绞浇鉀Q了我們所有的問題:
a、分頁問題:這里我們可以使用Query接口的來限制每次從第幾個開始最多獲取多少個數(shù)據(jù),這樣就可以按頁獲取數(shù)據(jù),而且可以利用sum來得到數(shù)據(jù)的總量,這樣分頁功能就可以很容易實(shí)現(xiàn)了。根據(jù)我的試驗(yàn),速度比原來快了一倍以上,而且原來根據(jù)數(shù)據(jù)量的增長還是線性下降的,而現(xiàn)在保持比較平穩(wěn)的速度。
b、構(gòu)造小對象的問題:這個問題來自于訂單列表的時候只是需要幾個簡單的字段,而不需要整個order,這個問題可以通過在HQL的select語句中利用new語句來構(gòu)造一個小的order對象,這樣進(jìn)一步節(jié)省了web服務(wù)器的內(nèi)存:)
c、聯(lián)合表查詢:比如需要根據(jù)聯(lián)系人信息查order,而聯(lián)系人是order的一個子表,這個時候可以利用HQL很直觀的寫出這樣的查詢:eg:select new SmallOrder(order.a,order.b,order.c) from Order as order where order.contact.name='crab'(結(jié)合了b問題)這樣我們根本就不需要擔(dān)心客戶的bt要求,他想怎么查詢訂單我都可以很容易的給他加上查詢條件。
最后就是我們的產(chǎn)品模塊,原來為了能夠最大限度的擴(kuò)展,利用了萬能表的方式,這樣什么產(chǎn)品都可以定義出來,但是這樣的設(shè)計(jì)不利于做報表和查詢,現(xiàn)在可以利用Hibernate重新設(shè)計(jì)產(chǎn)品模塊,也可以很方便的萬能化,但是查詢和報表就可以很方便了。
總之,Hibernate給我們項(xiàng)目帶來了真真實(shí)實(shí)的好處,從開發(fā)效率和運(yùn)行效率上都是,特別是可以使用面向?qū)ο蟮姆绞饺ゲ僮鲾?shù)據(jù)庫,這樣可以很面向?qū)ο蟮貙懫髽I(yè)程序,可以帶來開發(fā)時候真實(shí)地快樂:)
還有一個最大的體會是Hibernate很少違反我的直覺,很多時候我只是覺得這個特性Hibernate應(yīng)該支持,然后就試驗(yàn),然后就成功了,根本不需要去看文檔,這個和Python的“最少驚奇”原則妙曲同工。

文章來源:
http://blog.donews.com/crabhn/archive/2006/02/24/739825.aspx