Java程序员从笨鸟到菜鸟之(八十一)细谈Spring(十)深入源码分析Spring之HibernateTemplate 和HibernateDaoSupport
spring提供訪問(wèn)數(shù)據(jù)庫(kù)的有三種方式:
?
HibernateDaoSupport
HibernateTemplate(推薦使用)
jdbcTemplate(我們一般不用)
類所在包:
HibernateTemplate:org.springframework.orm.hibernate3.HibernateTemplate
HibernateDaoSupport:org.springframework.orm.hibernate3.support.HibernateDaoSupport
? ? ? ?spring如果想整合hibernate的話,首先就應(yīng)該獲得SessionFactory這個(gè)類,然后再通過(guò)獲得session就可以進(jìn)行訪問(wèn)數(shù)據(jù)庫(kù)了,即spring提供的類HibernateDaoSupport,HibernateTemplate應(yīng)該是有setSessionFactory,在使用的時(shí)候注入一下就可以了。HibernateTemplate類中的方法是spring封裝了hibernate中的方法,在使用完了以后會(huì)自動(dòng)釋放session。而如果使用了HibernateDaoSupport的getSession方法,就需要配套的用releaseSession(Session?session)或者session.close來(lái)關(guān)閉session,無(wú)法實(shí)現(xiàn)自動(dòng)管理session。所以很多人都傾向于用spring的?Hibernatetemplate類或者HibernateDaoSupport的getHibernateTemplate方法來(lái)實(shí)現(xiàn)實(shí)現(xiàn)數(shù)據(jù)庫(kù)的交互,當(dāng)然,如果遇到hibernatetemplate無(wú)法實(shí)現(xiàn)的功能,可以使用?HibernateDaoSupport。
首先我們先來(lái)看一下HibernateTemplate類:
首先我們來(lái)說(shuō)一下我們?yōu)槭裁匆?/span>HibernateTemplate,其實(shí)這個(gè)類就是我們平常使用hibernate進(jìn)行dao操作的一個(gè)模版,我們不需要那些開(kāi)頭的開(kāi)啟事務(wù)、獲得session,結(jié)尾的提交事務(wù),關(guān)閉session等操作了,這些工作是HibernateTemplate都給我們封裝好了,我們直接調(diào)用其dao的操作方法就可以了,并且他還給我們封裝了hibernate的幾乎所有的異常,這樣我們?cè)谔幚懋惓5臅r(shí)候就不要記住那么多繁瑣的異常了。所以我們就叫他是一個(gè)hibernate中dao操作的模版,他提供的常用方法:
get?從數(shù)據(jù)庫(kù)相關(guān)表中獲取一條記錄并封裝返回一個(gè)對(duì)象(Object)?
load?作用與get基本相同,不過(guò)只有在對(duì)該對(duì)象的數(shù)據(jù)實(shí)際調(diào)用時(shí),才會(huì)去查詢數(shù)據(jù)庫(kù)?
save?添加記錄?
saveOrUpdate?判斷相應(yīng)記錄是否已存在,據(jù)此進(jìn)行添加或修改記錄
update?修改記錄?
delete?刪除記錄??
下面我們來(lái)看一下HibernateTemplate的源碼來(lái)看一下他的具體方法是怎么樣實(shí)現(xiàn)的,其實(shí)你觀察源碼可以發(fā)現(xiàn),他所提供的方法幾乎都是一個(gè)實(shí)現(xiàn)實(shí)現(xiàn)的。下面我們就以save方法來(lái)具體看一下:
[java]?view plaincopy print?
? ? ? ?我們從源碼中可以發(fā)現(xiàn),HibernateTemplate把我們hibernate的異常都封裝成了一個(gè)DataAccessException?。好了,解釋一下上面的代碼,上面代碼中主要是調(diào)用了executeWithNativeSession這個(gè)方法,其實(shí)這個(gè)方法就是給我們封裝好的hibernate開(kāi)頭和結(jié)尾一些列操作,他需要一個(gè)參數(shù),這個(gè)參數(shù)是一個(gè)回調(diào)的對(duì)象,其實(shí)這個(gè)對(duì)象是實(shí)現(xiàn)了一個(gè)HibernateCallback的接口,實(shí)現(xiàn)這個(gè)接口需要實(shí)現(xiàn)這個(gè)接口里面的方法doInHibernate,這個(gè)方法需要把當(dāng)前的session傳遞過(guò)來(lái),其實(shí)他就是把他原先模版里獲得的session傳過(guò)去。然后在在doInHibernate中利用模版中得到的session進(jìn)行保存數(shù)據(jù)。其實(shí)我們調(diào)用save的過(guò)程就是給他傳一個(gè)回調(diào)對(duì)象的過(guò)程,我們可以看到,他的回調(diào)對(duì)象是new出來(lái)的。
?????如果你還沒(méi)看懂的話,那大家來(lái)看一下下面我們實(shí)現(xiàn)自己的HibernateTemplate,他的思路和spring提供的基本是一樣的:其中MyHibernateCallback?是一個(gè)簡(jiǎn)單接口:
[java]?view plaincopy print?
? ? 好了,原理我們介紹完了之后,下面我們來(lái)看一下具體應(yīng)用,這個(gè)HibernateTemplate在我們的程序中怎么用,在上面我們也說(shuō)過(guò)了,這個(gè)用法主要是把sessionfactory注入給我們的HibernateTemplate
首先我們來(lái)看一下beans.xml的配置:
[html]?view plaincopy print?
下一步我們來(lái)看一下hibernateTemplate的使用:
[html]?view plaincopy print?
這基本上就是我們的hibernateTemplate原理及使用了,其實(shí)他的使用很簡(jiǎn)單
下面,我們來(lái)看一下HibernateDaoSupport:
通過(guò)上面我們可以看出,通過(guò)xml注入hibernateTemplate,我們可以想象的到所有DAO類中都會(huì)有HibernateTemplate的bean方法,于是上面hibernateTemplate的set、get的方法和xml配置會(huì)有大量的,于是就出現(xiàn)了代碼冗余和重復(fù),我們?cè)趺床拍鼙苊膺@個(gè)重復(fù)呢,我們很容易應(yīng)該能想到,把上面注入hibernateTemplate抽出一個(gè)類,然后讓我們的dao類來(lái)繼承這個(gè)類。不過(guò)這個(gè)類Spring已經(jīng)有了,那就是HibernateDaoSupport,除此之外,HibernateDaoSupport也有SessionFactory的bean方法,所以我們?cè)谟肏ibernateDaoSupport的時(shí)候同樣也要給我們注入sessionfactory或者h(yuǎn)ibernateTemplate,在用的時(shí)候你會(huì)發(fā)現(xiàn)HibernateDaoSupport也給我們提供了getHibernateDaoSupport方法。
相關(guān)配置示例:userdao繼承了HibernateDaoSupport
[html]?view plaincopy print?
? ? ?用上面的方法我們可以發(fā)現(xiàn)一個(gè)問(wèn)題,我們同樣解決不了xml配置重復(fù)的問(wèn)題,我們每一個(gè)dao都要在xml注入sessionfactory或者h(yuǎn)ibernateTemplate,解決這個(gè)問(wèn)題的辦法就是我們自己在抽出一個(gè)SuperDao類,讓這個(gè)類去繼承HibernateDaoSupport,然后我們給SuperDao類去配置,這樣的話,我們?cè)谖业膁ao類中直接去繼承SuperDao類就可以了,這樣不管有多少dao類,只要繼承SuperDao,我們就可以實(shí)現(xiàn)我們想要的功能了。
from:?http://blog.csdn.net/csh624366188/article/details/7665489
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的Java程序员从笨鸟到菜鸟之(八十一)细谈Spring(十)深入源码分析Spring之HibernateTemplate 和HibernateDaoSupport的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Java程序员从笨鸟到菜鸟之(八十)细谈
- 下一篇: Java程序员从笨鸟到菜鸟之(八十五)跟