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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

spring的HibernateDaoSupport以及HibernateTemplate和jdbcTemplate的选择问题

發(fā)布時(shí)間:2025/6/15 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 spring的HibernateDaoSupport以及HibernateTemplate和jdbcTemplate的选择问题 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Xml代碼 ?
  • pring提供訪問數(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)行訪問數(shù)據(jù)庫(kù)了??
  • ??
  • 即spring提供的類HibernateDaoSupport,HibernateTemplate應(yīng)該是有setSessionFactory,在使用的時(shí)候注入一下就可以了??
  • ??
  • ????<bean?id="sessionFactory"?class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">??
  • ???????<property?name="dataSource"?ref="dataSource"></property>??
  • ???????<property?name="annotatedClasses">??
  • ????????<list>??
  • ?????????<value>com.zcy.model.User</value>??
  • ?????????<value>com.zcy.model.Log</value>??
  • ????????</list>??
  • ???????</property>??
  • ???????<property?name="hibernateProperties">??
  • ???????<props>??
  • ????????<prop?key="hibernate.dialect">??
  • ?????????org.hibernate.dialect.OracleDialect??
  • ????????</prop>??
  • ????????<prop?key="hibernate.hbm2ddl.auto">update</prop>??
  • ????????<prop?key="hibernate.show_sql">??
  • ?????????true??
  • ????????</prop>??
  • ???????</props>??
  • ??????</property>??
  • ??????</bean>??
  • ??
  • 對(duì)于HibernateTemplate:??
  • ??
  • ????<bean?id="hibernateTemplate"?class="org.springframework.orm.hibernate3.HibernateTemplate">??
  • ??????<property?name="sessionFactory"?ref="sessionFactory"></property>??
  • ?????</bean>??
  • ??
  • 在程序中直接用就可以了,如下??
  • ??
  • ????@Component("u")??
  • ????public?class?UserDaoImpl_HibernateTemplate?implements?UserDao?{??
  • ?????private?HibernateTemplate??hibernateTemplate;??
  • ??????
  • ?????@Resource??
  • ?????public?void?setHibernateTemplate(HibernateTemplate?hibernateTemplate)?{??
  • ??????this.hibernateTemplate?=?hibernateTemplate;??
  • ?????}??
  • ??????
  • ??
  • ?????public?void?save(User?user)?{??
  • ??????hibernateTemplate.save(user);??
  • ?????}??
  • ??
  • ????}??
  • ??
  • 對(duì)于HibernateDaoSupport:??
  • ??
  • ????public?final?void?setSessionFactory(SessionFactory?sessionFactory)??
  • ??
  • ????public?final?SessionFactory?getSessionFactory()??
  • ??
  • ????public?final?void?setHibernateTemplate(HibernateTemplate?hibernateTemplate)??
  • ??
  • ????public?final?HibernateTemplate?getHibernateTemplate()??
  • ??
  • 從它類里的方法可以知道,在使用的時(shí)候只需要將sessionFactory注入給HibernateDaoSupport,然后就可以通過(guò)getHibernateTemplate??
  • ??
  • 來(lái)獲得HibernateTemplate,這樣就可以使用HibernateTemplate了,就和上面使用HibernateTemplate的一樣的??
  • ??
  • (顯然這有點(diǎn)繞了一點(diǎn)彎,個(gè)人感覺還是直接使用HibernateTemplate就可以了,不過(guò)根據(jù)個(gè)人喜好或項(xiàng)目的需求而定)??
  • ??
  • 下面是實(shí)現(xiàn)設(shè)計(jì)的方法:??
  • ??
  • service:??
  • ??
  • ????public?class?UserService?{??
  • ??
  • ?????private?UserDao?userDao;??
  • ??????
  • ?????public?void?setUserDao(UserDao?userDao)?{??
  • ??????this.userDao?=?userDao;??
  • ?????}??
  • ???????
  • ?????public?void?add(User?user){??
  • ????????userDao.save(user);??
  • ?????}??
  • ??
  • dao:??
  • ??
  • ????public?class?UserDaoImpl?extends?HibernateDaoSupport?implements?UserDao?{??
  • ?????public?void?save(User?user)?{??
  • ????????this.getHibernateTemplate().save(user);??
  • ?????}??
  • ??
  • ????}??
  • ??
  • bean.xml:??
  • ??
  • ????<bean?id="userService"?class="com.zcy.service.UserService">??
  • ??????<property?name="userDao"?ref="userDao"></property>??
  • ?????</bean>??
  • ??
  • ??
  • ?????<bean?id="userDao"?class="com.zcy.dao.impl.UserDaoImpl">??
  • ??????<property?name="sessionFactory"?ref="sessionFactory"></property>??
  • ?????</bean>??
  • ??
  • 這里的sessionFacotry注入不是給類UserDaoImpl?的,而是給繼承HibernateDaoSupport類的sessionFactory,使用HibernateDaoSupport好處就是我們不再需要關(guān)心關(guān)閉、??
  • ??
  • 是否連接成功等問題(在使用spring封裝的這些類,即HibernateDaoSupport,HibernateTemplate,jdbcTemplate,都不需要關(guān)心是否關(guān)閉,是否連接的問題,因?yàn)閟pring已這些操作封裝給注入好了),??
  • ??
  • 這樣用起來(lái)很方便。但是這個(gè)不好就是java只支持單繼承,所以唯一的繼承給了HibernateDaoSupport有點(diǎn)可惜。??
  • ??
  • 另外注意的是因?yàn)镠ibernateDaoSupport已經(jīng)有setSessionFactory(SessionFactory?sessionFactory)這個(gè)方法了,所以在UserDaoImpl?的類里就不需要寫了,??
  • ??
  • 并且HibernateDaoSupport的setSessionFactory的方法時(shí)final的,所以重寫還會(huì)報(bào)錯(cuò)的。??
  • ??
  • ???
  • ??
  • 對(duì)于jdbcTemplate以后再做整理吧??
  • ??
  • ???
  • ??
  • ???
  • ??
  • hibernateTemplate的常用方法:??
  • ??
  • ?void?delete(Object?entity):刪除指定持久化實(shí)例??
  • ??
  • ?deleteAll(Collection?entities):刪除集合內(nèi)全部持久化類實(shí)例??
  • ??
  • ?find(String?queryString):根據(jù)HQL查詢字符串來(lái)返回實(shí)例集合??
  • ??
  • ?findByNamedQuery(String?queryName):根據(jù)命名查詢返回實(shí)例集合??
  • ??
  • ?get(Class?entityClass,?Serializable?id):根據(jù)主鍵加載特定持久化類的實(shí)例??
  • ??
  • ?save(Object?entity):保存新的實(shí)例??
  • ??
  • ?saveOrUpdate(Object?entity):根據(jù)實(shí)例狀態(tài),選擇保存或者更新??
  • ??
  • ?update(Object?entity):更新實(shí)例的狀態(tài),要求entity是持久狀態(tài)??
  • ??
  • ?setMaxResults(int?maxResults):設(shè)置分頁(yè)的大小??
  • ??
  • ???
  • ??
  • HibernateDaoSupport:??
  • ??
  • Spring為Hibernate的DAO提供工具類:HibernateDaoASupport。該類主要提供如下兩個(gè)方法,方便DAO的實(shí)現(xiàn):??
  • ??
  • 1、public?final?HibernateTemplate?getHibernateTemplate()??
  • ??
  • 2、public?final?void?setSessionFactory(SessionFactory?sessionFactory)??
  • ??
  • 其中setSessionFactory方法用來(lái)接收Spring的ApplicationContext的依賴注入,可接收配置在Spring的SessionFactory實(shí)例,getHibernateTemplate方法則用來(lái)更具獲得的SessionFactory產(chǎn)生Session,最后生成HibernateTeplate來(lái)完成數(shù)據(jù)庫(kù)訪問。??
  • ??
  • HibernateTemplate用于持久層的訪問,該模板無(wú)需打開session及關(guān)閉Session。它只要獲得SessionFactory的引用,就可以打開Session,并在持久化訪問結(jié)束后關(guān)閉Session,程序開發(fā)只需要完成持久曾邏輯,通用的CRUD操作由HibernateTemplate完成.??
  • ??
  • 其實(shí)Spring+hibernate訪問數(shù)據(jù)庫(kù)有以下幾種方法:??
  • ??
  • 1、注入SessionFactory??
  • ??
  • 在spring配置文件中,對(duì)Dao注入sessionFactory.比較簡(jiǎn)單。??
  • ??
  • 如:??
  • ??
  • <beanidbeanid="UserInfoDao"class="com.hr2job.dao.impl.UserInfoDaoImpl">??
  • ??
  • ?????????<propertynamepropertyname="sessionFactory"ref="sessionFactory"></property>??
  • ??
  • </bean>??
  • ??
  • 這里的sessionFacotry注入不是給類的,而是給繼承HibernateDaoSupport類的sessionFactory,在上面源碼中可以看到。以前寫SSH程序的時(shí)候就是用這個(gè)的,因?yàn)槭遣恢?#xff0c;這個(gè)好處就是我們不再需要關(guān)心關(guān)閉、是否連接成功等問題。主要是很方便。但是這個(gè)不好就是java只支持單繼承,所以唯一的繼承給了HibernateDaoSupport有點(diǎn)可惜。而且也沒有必要這樣做。??
  • ??
  • 2、注入HibernateTemplate??
  • ??
  • 這種方法本質(zhì)上跟上面的sessionFacotry一樣,只不過(guò)進(jìn)行了一層包裝,好處就是Dao中的類就不用再繼承那個(gè)HibernateDaoSuport了,不過(guò)要先配置好HibernateTemplate:??
  • ??
  • <bean?id="hibernateTemplate"?class="org.springframework.orm.hibernate3.HibernateTemplate">??
  • ????????<property?name="sessionFactory">??
  • ????????????<ref?bean="sessionFactory"/>??
  • ????????</property>??
  • ???</bean>??
  • ??
  • 非常的方便,我現(xiàn)在就在用這個(gè)了。其實(shí)并沒有改多少,就是曾經(jīng)的sessionFactroy改成了hibernatemplate。??
  • ??
  • 3、注入jdbcTemplate??
  • ??
  • 這種方法適合那些不喜歡hibernate的save,delete等方法,喜歡自己寫的N人吧。有時(shí)候jdbcTemplate查詢的效率會(huì)很高。這可能是跟jdbc有關(guān)吧。??
  • ??
  • 配置如下:??
  • ??
  • <bean?id="jdbcTemplate"?class="org.springframework.jdbc.core.JdbcTemplate">??
  • ???<property?name="dataSource">??
  • ????<ref?bean="dataSource"?/>??
  • ???</property>??
  • </bean>??
  • ??
  • 在類中set方法jdbctemplate方法就可以了,spring中的配置跟sessionFactory基本一樣。??
  • ??
  • 總的感覺還是喜歡HibernateTemplate,原因就是好用,不需要寫太多的sql語(yǔ)句,不需要??
  • ??
  • 類去繼承,只要提供一個(gè)set方法,再注入一下很方便。??
  • 轉(zhuǎn)載之?http://blog.csdn.net/zcywell/article/details/7191466??做個(gè)記錄??
  • ?

    總結(jié)

    以上是生活随笔為你收集整理的spring的HibernateDaoSupport以及HibernateTemplate和jdbcTemplate的选择问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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