`

HibernateTemplate和HibernateDaoSupport

阅读更多
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) 

   load 作用与get基本相同,不过只有在对该对象的数据实际调用时,才会去查询数据库 
   save 添加记录 
   saveOrUpdate 判断相应记录是否已存在,据此进行添加或修改记录
   update 修改记录 
   delete 删除记录  

 

   下面我们来看一下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的配置:
 
<?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>  
 下一步我们来看一下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

 

<bean id="userdao" class="com.bzu.dao.uerdao">  
<property name="sessionFactory" ref="sessionFactory"></property>  
</bean

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

分享到:
评论

相关推荐

    hibernateTemplate和HibernateDaoSupport

    hibernateTemplate 和 HibernateDaoSupport 是 Spring 框架中针对 Hibernate 数据库访问层的两个重要组件,它们简化了基于 Hibernate 的数据操作,使得开发者能够更高效地进行 CRUD(创建、读取、更新、删除)操作。...

    Spring+Hibernate实现增删改查的两种方法

    本文将深入探讨如何利用Spring与Hibernate整合,通过两种不同的方式来实现这些基本操作:HibernateTemplate和HibernateDaoSupport。 **一、HibernateTemplate** HibernateTemplate是Spring提供的一个方便的类,它...

    跟我学Spring3(8.2)对ORM的支持之集成Hibe

    1. **HibernateTemplate和HibernateDaoSupport**:Spring提供了一组Hibernate相关的工具类,如HibernateTemplate和HibernateDaoSupport,它们简化了Hibernate的使用。HibernateTemplate是一个模板类,它封装了许多...

    Spring,Hibernate整合源码

    4. **HibernateTemplate与HibernateDaoSupport**:Spring提供了HibernateTemplate和HibernateDaoSupport,它们为DAO层提供了便捷的操作方法,如save、update、delete、find等,同时处理了事务和异常。 5. **JPA集成...

    Spring3整合Hibernate4测试Demo

    4. **Spring的HibernateTemplate或HibernateDaoSupport**:Spring提供了HibernateTemplate和HibernateDaoSupport类,用于简化Hibernate操作。在这个Demo中,可能会使用它们来封装数据访问操作。 5. **Entity(实体...

    Spring相关测试4

    在“Spring相关测试4”中,我们将重点探讨Spring框架如何与Hibernate ORM工具进行整合,特别是在使用HibernateTemplate和HibernateDaoSupport这两个关键组件时的不同版本测试。这将帮助我们了解如何在不同版本的...

    spring整合hibernate的jar包

    5. **HibernateTemplate和HibernateDaoSupport**:Spring提供了`HibernateTemplate`和`HibernateDaoSupport`这两个工具类,简化了Hibernate的操作。HibernateTemplate提供了一种线程安全的方式来执行HQL和QBC查询,...

    spring java

    `spring_integration_hibernate3_hibernateDaoSupport`和`spring_integration_hibernate3_basic`两个文件,展示了如何利用Spring的HibernateTemplate和HibernateDaoSupport类进行数据操作。这些类提供了一套简化...

    跟我学Spring3(8.1)对ORM的支持之概述Java

    Spring的HibernateTemplate和HibernateDaoSupport类为开发者提供了方便的DAO层实现。同时,Spring的TransactionManagement支持使得可以在一个统一的事务策略下使用Hibernate,无需关心底层事务的管理。 2. JPA...

    pring对JDBC和orm的支持共10页.pdf.zip

    例如,Spring通过HibernateTemplate和HibernateDaoSupport为Hibernate提供了便捷的抽象层,使得在Spring应用中使用Hibernate更加方便。对于MyBatis,Spring通过MapperFactoryBean和SqlSessionTemplate提供了类似的...

    spring-note spring 读书笔记

    4. **Spring与Hibernate的集成**: Spring通过HibernateTemplate和HibernateDaoSupport简化了Hibernate的使用。`spring集成hibernate配置文件.txt`可能包含了整合步骤、事务配置以及如何处理SessionFactory和Session...

    spring2.5.jar

    对于Hibernate的集成,Spring提供了HibernateTemplate和HibernateDaoSupport等抽象类,使得开发者可以方便地进行数据访问操作,而无需直接与SessionFactory或Session打交道。Spring的事务管理与Hibernate的事务边界...

    整合struts+hibernate+spring应用开发详解 part3

    2. **Spring与Hibernate集成**:Spring提供了HibernateTemplate和HibernateDaoSupport等工具类,简化了对Hibernate的操作。这部分可能详细介绍了如何通过Spring管理SessionFactory,如何在Service层使用...

    Spring整合HIbernate

    3. **DAO(Data Access Object)抽象**:Spring的HibernateTemplate和HibernateDaoSupport为编写DAO层代码提供了便利,简化了与Hibernate Session的交互。 4. **基于注解的配置**:Spring 3.0及以上版本支持基于...

    Struts Hibernate Spring 集成开发宝典 tutorial

    2. **整合Hibernate和Spring**:Spring提供了HibernateTemplate和HibernateDaoSupport,用于简化Hibernate的使用。通过Spring的事务管理,可以在方法级别控制事务的开始、提交、回滚,避免了手动管理事务的复杂性。 ...

    Spring 3.2.4

    在这个版本中,Spring提供了更强大的HibernateTemplate和HibernateDaoSupport,帮助开发者更好地管理事务和执行数据库操作。 在Struts2.3.15的集成中,Spring可以作为动作类的依赖注入容器,提供Action实例的生命...

    Spring资料大全

    对于ORM框架,Spring提供了一整套集成解决方案,如HibernateTemplate和HibernateDaoSupport,帮助我们无缝地使用Hibernate进行对象-关系映射。 Spring MVC是Spring框架的一个重要组成部分,用于构建Web应用程序。它...

    spring学习资料

    3. **DAO支持**:Spring的HibernateTemplate和HibernateDaoSupport类为Hibernate操作提供了便捷的抽象层,简化了DAO层的编写。 4. **异常翻译**:Spring会将Hibernate的特定异常转换为Spring的DataAccessException...

    spring-orm源码

    Spring-ORM提供了对DAO层的支持,例如HibernateDaoSupport和JpaDaoSupport类。这些类提供了方便的方法,如getHibernateTemplate()或getEntityManager(),使得开发DAO接口变得简单。源码中可以查看这些类的实现,...

Global site tag (gtag.js) - Google Analytics