spring的HibernateDaoSupport以及HibernateTemplate和jdbcTemplate的选择问题
生活随笔
收集整理的這篇文章主要介紹了
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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spring管理hibernate的Se
- 下一篇: HibernateTemplate、Hi