日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

Java程序员从笨鸟到菜鸟之(八十一)细谈Spring(十)深入源码分析Spring之HibernateTemplate 和HibernateDaoSupport

發(fā)布時(shí)間:2025/3/21 java 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java程序员从笨鸟到菜鸟之(八十一)细谈Spring(十)深入源码分析Spring之HibernateTemplate 和HibernateDaoSupport 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

spring提供訪問(wèn)數(shù)據(jù)庫(kù)的有三種方式:

?

HibernateDaoSupport

HibernateTemplate(推薦使用)

jdbcTemplate(我們一般不用)


類所在包:

HibernateTemplateorg.springframework.orm.hibernate3.HibernateTemplate

HibernateDaoSupportorg.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?
  • public?Serializable?save(final?Object?entity)?throws?DataAccessException?{??
  • return?(Serializable)?executeWithNativeSession(new?HibernateCallback()?{??
  • public?Object?doInHibernate(Session?session)?throws?HibernateException?{??
  • checkWriteOperationAllowed(session);??
  • return?session.save(entity);??
  • }??
  • });}??


  • ? ? ? ?我們從源碼中可以發(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?
  • import?org.hibernate.Session;??
  • public?class?MyHibernateTemplate?{??
  • public?void?executeWithNativeSession(MyHibernateCallback?callback)?{??
  • Session?s?=?null;??
  • try?{??
  • s?=?getSession();??
  • s.beginTransaction();??
  • callback.doInHibernate(s);??
  • s.getTransaction().commit();??
  • }?catch?(Exception?e)?{??
  • s.getTransaction().rollback();??
  • }?finally?{??
  • //...??
  • }??
  • }??
  • private?Session?getSession()?{??
  • //?TODO?Auto-generated?method?stub??
  • return?null;??
  • }??
  • public?void?save(final?Object?o)?{??
  • new?MyHibernateTemplate().executeWithNativeSession(new?MyHibernateCallback()?{??
  • public?void?doInHibernate(Session?s)?{??
  • s.save(o);??
  • }??
  • });??
  • }??
  • }??


  • ? ? 好了,原理我們介紹完了之后,下面我們來(lái)看一下具體應(yīng)用,這個(gè)HibernateTemplate在我們的程序中怎么用,在上面我們也說(shuō)過(guò)了,這個(gè)用法主要是把sessionfactory注入給我們的HibernateTemplate

    首先我們來(lái)看一下beans.xml的配置:


    [html]?view plaincopy print?
  • <?xml?version="1.0"?encoding="UTF-8"?>??
  • <beans?xmlns="http://www.springframework.org/schema/beans"??
  • xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"??
  • xmlns:context="http://www.springframework.org/schema/context"??
  • xmlns:aop="http://www.springframework.org/schema/aop"??
  • xmlns:tx="http://www.springframework.org/schema/tx"??
  • xsi:schemaLocation="http://www.springframework.org/schema/beans??
  • ???????????http://www.springframework.org/schema/beans/spring-beans-2.5.xsd??
  • ???????????http://www.springframework.org/schema/context??
  • ???????????http://www.springframework.org/schema/context/spring-context-2.5.xsd??
  • ???????????http://www.springframework.org/schema/aop??
  • ???????????http://www.springframework.org/schema/aop/spring-aop-2.5.xsd??
  • ???????????http://www.springframework.org/schema/tx???
  • ???????????http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">??
  • <bean?id="dataSource"??
  • class="org.apache.commons.dbcp.BasicDataSource"??
  • destroy-method="close">??
  • <property?name="driverClassName"?value="com.mysql.jdbc.Driver"?/>??
  • <property?name="url"?value="jdbc:mysql://localhost:3306/spring"?/>??
  • <property?name="username"?value="root"?/>??
  • <property?name="password"?value="bjsxt"?/>??
  • </bean>??
  • <bean?id="sessionFactory"??
  • class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">??
  • <property?name="dataSource"?ref="dataSource"?/>??
  • <property?name="annotatedClasses">??
  • <list>??
  • <value>com.bjsxt.model.User</value>??
  • <value>com.bjsxt.model.Log</value>??
  • </list>??
  • </property>??
  • <property?name="hibernateProperties">??
  • <props>??
  • <prop?key="hibernate.dialect">??
  • org.hibernate.dialect.MySQLDialect??
  • </prop>??
  • <prop?key="hibernate.show_sql">true</prop>??
  • </props>??
  • </property>??
  • </bean>??
  • <bean?id="hibernateTemplate"?class="org.springframework.orm.hibernate3.HibernateTemplate">??
  • <property?name="sessionFactory"?ref="sessionFactory"></property>??
  • </bean>??
  • <bean?id="UserDao"?class="com.bzu.dao.userDao">??
  • <property?name="hibernateTemplate"?ref="hibernateTemplate"></property>??
  • </bean>??
  • </beans>??


  • 下一步我們來(lái)看一下hibernateTemplate的使用:

    [html]?view plaincopy print?
  • public?class?UserDAOImpl?implements?UserDAO?{??
  • private?HibernateTemplate?hibernateTemplate;??
  • public?HibernateTemplate?getHibernateTemplate()?{??
  • return?hibernateTemplate;??
  • }??
  • public?void?setHibernateTemplate(HibernateTemplate?hibernateTemplate)?{??
  • this.hibernateTemplate?=?hibernateTemplate;??
  • }??
  • public?void?save(User?user)?{??
  • hibernateTemplate.save(user);??
  • }}??


  • 這基本上就是我們的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?
  • <bean?id="userdao"?class="com.bzu.dao.uerdao">??
  • <property?name="sessionFactory"?ref="sessionFactory"></property>??
  • </bean>??


  • ? ? ?用上面的方法我們可以發(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)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: av一级大片 | www.久久网 | 成人中文网 | 亚洲黄色片 | www.18av| 亚洲一区二区自偷自拍 | 中文字幕人妻一区二区三区视频 | 香蕉婷婷 | 人妖一级片 | 亚洲精品久久久久久久蜜桃 | 91色交视频 | 中文在线一区 | 国产精品综合久久久久久 | 啪啪中文字幕 | 少妇xxxx| 国产精品久久久99 | 国产精品视频免费网站 | 麻豆回家视频区一区二 | 日本狠狠操 | 最新中文字幕在线观看 | 色校园| 欧美人体视频 | 亚洲一区二区视频在线播放 | 欧美在线观看视频 | 97超碰免费 | 香蕉视频国产 | 九九一级片| 97影院在线午夜 | www.三级 | 欧美一级片a | 亚洲高清在线观看 | 国产亚洲av片在线观看18女人 | 中文字幕在线播出 | 性色一区二区 | 综合色婷婷一区二区亚洲欧美国产 | 中文不卡在线 | 国产一级片黄色 | 亚洲日本精品视频 | 天堂影院一区二区 | 成人黄色一级 | 国产精品一区二区入口九绯色 | 国产亚洲成人精品 | 在线观看国产亚洲 | 精品xxxxx | 国产资源av| 欧美精品在线观看 | 毛片视频免费观看 | 开心激情综合网 | 久久中文字幕一区二区 | 在线播放色 | 亚洲二三区 | 日本强好片久久久久久aaa | 夫妻性生活自拍 | 成人性生交大片免费看96 | 久热免费视频 | 人物动物互动39集免费观看 | 国产精品国产三级国产专区51区 | 国产三级理论 | 人妻熟女一区二区aⅴ水 | 国产粉嫩在线 | 欧美另类videos | aaa人片在线 | 午夜一区 | 欧美整片sss | 国产中文网| 国产精品一区av | 女色综合| 亚洲色域网 | 欧美黄色录像带 | 日本美女黄视频 | 天天碰天天操 | 啪视频免费 | 精品欧美一区二区三区久久久 | 国产日韩网站 | 在线观看中文字幕码 | 花房姑娘免费全集 | a级一a一级在线观看 | 99久久久久无码国产精品 | 成人午夜淫片免费观看 | 精品久久久无码中文字幕 | 成人午夜视频在线免费观看 | 欧美鲁| 国产麻豆91 | 久久黄色网络 | 欧美一区二区三区粗大 | 黄色喷水网站 | 91爱爱网站 | www.国产色 | 精品国产乱码久久久久久预案 | 午夜三级影院 | 深夜国产视频 | www.久久成人| 人妻久久一区二区 | 日批av| 亚洲天堂网在线观看 | 国产精品成 | 短裙公车被强好爽h吃奶视频 | 欧美片在线观看 | 欧美性吧 |