周末和 MIKE 吃飯的時候,他詢問,上次提說的問題,什么時候能寫出來。“對Session和Transaction的處理,最好單獨(dú)實(shí)現(xiàn)一個模板類來統(tǒng)一做”
溫故 居于常規(guī)的Hibernate的DAO代碼。例子做一個Create操作
這段代碼怎么樣? 假如這樣的代碼會出現(xiàn)在你的每一個DAO的每一個方法里面(除了SessionFactory建議寫成一個方法,因?yàn)槟阒恍枰粋€實(shí)例)你能接受嗎?只說try catch 就夠你寫的。
如果代碼在每個地方都出現(xiàn)。那么我想就可以抽離出來。做成一個模板。具體該怎么做呢?今天我打算談三種比較成熟的做法。
① 采用Spring提供的模板功能
② 自己實(shí)現(xiàn)一個功能相當(dāng)?shù)哪0?SPAN lang=EN-US>
③ 其他可借鑒的實(shí)現(xiàn)
采用Spring提供的模板功能
看代碼:
比起上面的代碼,現(xiàn)在簡單多了吧?其實(shí)該做的事情都做了,只不過是被Spring封裝起來了。大致跟蹤一下Spring的SourceCode的實(shí)現(xiàn)。
1) 在抽象類HibernateDaoSupport中有一個方法getHibernateTemplate()。通過getHibernateTemplate()得到一個HibernateTemplate對象。
2) 在HibernateDaoSupport中有兩個方法。通過他們來的到這個 HibernateTemplate對象
3)
4)
到這里,感覺還不錯吧? 要是你沒有打算使用Spring呢?這種優(yōu)勢不就沒有了嗎?那到未必,既然都有得“抄襲”拉!就自己弄一個吧!
自己實(shí)現(xiàn)一個功能相當(dāng)?shù)哪0?SPAN lang=EN-US>
不容易描述清楚,就用簡單的代碼來說明吧。
上面的DAO實(shí)現(xiàn)還有代碼風(fēng)格都不推薦大家學(xué)習(xí)。實(shí)現(xiàn)一個優(yōu)秀的DAO框架沒這么簡單。這種做法我沒有在真實(shí)項(xiàng)目中檢驗(yàn)過,不確定,會不會有其他問題。因?yàn)檫@里我只是為了簡單的表述HibernateTemplate思想的實(shí)現(xiàn)。只要理解了這種思想,相信你能寫出更好更完美的實(shí)現(xiàn)。如果有更好的主意或者建議請Email告訴我。
其他可借鑒的實(shí)現(xiàn)
《深入淺出Hibernate》采用hibernatesynchronizer生成基礎(chǔ)代碼的方式,架構(gòu)自己的持久層。作者自己實(shí)現(xiàn)了一個相似功能的HibernateTemplate和HibernateCallback接口。有興趣的話可以去研究一下。
這種能直接生成基礎(chǔ)代碼的方式很不錯。比起Spring我還是覺得麻煩了很多。而且我也還沒時間去全面玩這個插件(據(jù)說,有提供一些成熟的模板方式生成,我只玩過默認(rèn)的生成方式)。
2005-12-6 SCSCHINA New Office
Powered by: BlogJava Copyright © Goingmm