HibernateTemplate和HibernateDaoSupport

HibernateTemplate和HibernateDaoSupportspring 提供访问数据库的有三种方式 nbsp nbsp HibernateDao nbsp nbsp HibernateTem 推荐使用 nbsp nbsp jdbcTemplate 我们一般不用 类所在包 HibernateTem org springframew orm hibernate3 HibernateTem

spring提供访问数据库的有三种方式:

    HibernateDaoSupport

    HibernateTemplate(推荐使用

    jdbcTemplate(我们一般不用)

类所在包:

HibernateTemplate:org.springframework.orm.hibernate3.HibernateTemplate

HibernateDaoSupport:org.springframework.orm.hibernate3.support.HibernateDaoSupport

 

    spring如果想整合hibernate的话,首先就应该获得SessionFactory这个类,然后再通过获得session就可以进行访问数据库了,即spring提供的类HibernateDaoSupport,HibernateTemplate应该是有setSessionFactory,在使用的时候注入一下就可以了。HibernateTemplate类中的方法是spring封装了hibernate中的方法,在使用完了以后会自动释放session。而如果使用了HibernateDaoSupport的getSession方法,就需要配套的用releaseSession(Session session)或者session.close来关闭session,无法实现自动管理session。所以很多人都倾向于用spring的 Hibernatetemplate类或者HibernateDaoSupport的getHibernateTemplate方法来实现实现数据库的交互,当然,如果遇到hibernatetemplate无法实现的功能,可以使用 HibernateDaoSupport。

    HibernateTemplate:

首先我们来说一下我们为什么要用HibernateTemplate,其实这个类就是我们平常使用hibernate进行dao操作的一个模版,我们不需要那些开头的开启事务、获得session,结尾的提交事务,关闭session等操作了,这些工作是HibernateTemplate都给我们封装好了,我们直接调用其dao的操作方法就可以了,并且他还给我们封装了hibernate的几乎所有的异常,这样我们在处理异常的时候就不要记住那么多繁琐的异常了。所以我们就叫他是一个hibernate中dao操作的模版,他提供的常用方法:

   get 从数据库相关表中获取一条记录并封装返回一个对象(Object) 

 

   下面我们来看一下HibernateTemplate的源码来看一下他的具体方法是怎么样实现的,其实你观察源码可以发现,他所提供的方法几乎都是一个实现实现的。下面我们就以save方法来具体看一下:

 

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);

    我们从源码中可以发现,HibernateTemplate把我们hibernate的异常都封装成了一个DataAccessException 。好了,解释一下上面的代码,上面代码中主要是调用了executeWithNativeSession这个方法,其实这个方法就是给我们封装好的hibernate开头和结尾一些列操作,他需要一个参数,这个参数是一个回调的对象,其实这个对象是实现了一个HibernateCallback的接口,实现这个接口需要实现这个接口里面的方法doInHibernate,这个方法需要把当前的session传递过来,其实他就是把他原先模版里获得的session传过去。然后在在doInHibernate中利用模版中得到的session进行保存数据。其实我们调用save的过程就是给他传一个回调对象的过程,我们可以看到,他的回调对象是new出来的。

   如果你还没看懂的话,那大家来看一下下面我们实现自己的HibernateTemplate,他的思路和spring提供的基本是一样的:其中MyHibernateCallback 是一个简单接口:

 

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); }

 好了,原理我们介绍完了之后,下面我们来看一下具体应用,这个HibernateTemplate在我们的程序中怎么用,在上面我们也说过了,这个用法主要是把sessionfactory注入给我们的HibernateTemplate

首先我们来看一下beans.xml的配置:
 
 
    
    
     
      
      
      
      
     
     
      
      
       
       
         com.bjsxt.model.User 
        
       
         com.bjsxt.model.Log 
        
       
      
      
       
       
         org.hibernate.dialect.MySQLDialect 
        
       
         true 
        
       
      
     
     
      
     
     
      
     
    
 下一步我们来看一下hibernateTemplate的使用:

 

this.hibernateTemplate = hibernateTemplate; 

 

HibernateDaoSupport:

    通过上面我们可以看出,通过xml注入hibernateTemplate,我们可以想象的到所有DAO类中都会有HibernateTemplate的bean方法,于是上面hibernateTemplate的set、get的方法和xml配置会有大量的,于是就出现了代码冗余和重复,我们怎么才能避免这个重复呢,我们很容易应该能想到,把上面注入hibernateTemplate抽出一个类,然后让我们的dao类来继承这个类。不过这个类Spring已经有了,那就是HibernateDaoSupport,除此之外,HibernateDaoSupport也有SessionFactory的bean方法,所以我们在用HibernateDaoSupport的时候同样也要给我们注入sessionfactory或者hibernateTemplate,在用的时候你会发现HibernateDaoSupport也给我们提供了getHibernateDaoSupport方法。

相关配置示例:userdao继承了HibernateDaoSupport

 

 
    
     
   

 用上面的方法我们可以发现一个问题,我们同样解决不了xml配置重复的问题,我们每一个dao都要在xml注入sessionfactory或者hibernateTemplate,解决这个问题的办法就是我们自己在抽出一个SuperDao类,让这个类去继承HibernateDaoSupport,然后我们给SuperDao类去配置,这样的话,我们在我的dao类中直接去继承SuperDao类就可以了,这样不管有多少dao类,只要继承SuperDao,我们就可以实现我们想要的功能了。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/212766.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午7:19
下一篇 2026年3月18日 下午7:19


相关推荐

  • Oracle ASMM和AMM

    Oracle ASMM和AMMASMM(AutomaticSharedMemoryManagement,自动共享内存管理)是Oracle10g引入的概念。通过使用ASMM,就不需要手工设置相关内存组件的大小,而只为SGA设置一个总的大小,Oracle的MMAN进程(MemoryManagerProcess,内存管理进程)会随着时间推移,根据系统负载的变化和内存需要,自动调整SGA中各个组件的内存大小。ASM…

    2022年6月7日
    54
  • LangChain 1.0 实战:手写 Plan-and-Execute Agent 框架

    LangChain 1.0 实战:手写 Plan-and-Execute Agent 框架

    2026年3月14日
    2
  • django restful API 代码自动生成_django apache部署

    django restful API 代码自动生成_django apache部署restful接口规范什么是接口规范?接口规范就是为了采用不同的后台语言,也能使用同样的接口获取到同样的数据。如何写接口:接口规范是规范化书写接口的,写接口要写url、响应数据​注:如果将请求参

    2022年8月7日
    8
  • Postman使用教程图解

    Postman使用教程图解postman的主要功能1、模拟HTTPrequests的一些方法:get、post、put等2、Collection:测试集合,你每测试一个项目建立一个collection,把请求放在一起,方便日后查阅,而且还能Import或者Share,整个团队的人都可以看到;3、Response形式多样一般在用其他工具来测试的時候,response的内容通常都是纯文字的raw,但如果是JSON,就是塞成一整行的JSON。这会造成阅读的障碍,而Postman可以针对response

    2022年5月31日
    52
  • 谷歌浏览器油猴插件安装教程(超详细),让你的浏览器更加强大[通俗易懂]

    谷歌浏览器油猴插件安装教程(超详细),让你的浏览器更加强大[通俗易懂]什么是扩展程序首先,你要知道油猴是什么的话,那你就必须知道谷歌浏览器的扩展程序是什么?点解浏览器右上角–>更多工具–>扩展程序,进入我们的扩展程序界面,在这里可以看到我们已经安装的扩展程序。那么扩展程序可以做什么呢?举个例子,像我安装的Infinity新标签页,就可以实现以下功能,将浏览器原本的新标签页样式变成这个样子那么油猴是干什么的呢其实,油猴就是属于我们上面说的扩…

    2022年7月14日
    198
  • JavaScript转义字符

    JavaScript转义字符本篇文章由泉州 SEOwww 234yp com 整理发布 js 教程 www 234yp com Article 188271 html 谢谢合作 js 教程转义字符是字符的一种间接表示方式 在特殊语境中 无法直接使用字符自身 例如 在字符串中包含说话内容 子曰 学而不思则罔 思而不学则殆 由于 JavaScript 已经赋予了双引号为字符串直接量的标识符 如果在字符串中包含双引号 就必须使用转义字符表示 子曰 学而不思则罔 思而不学则殆 JavaScript 定义反

    2026年3月20日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号