HibernateTemplate是Spring当中一个很方便的类,主要用于Hibernate中的DAO类中,对数据库记录进行直接操作,常用方法有(这里偷个懒,不把重载方法都一一列出来了,只有方法名以及简单功能介绍):
get 从数据库相关表中获取一条记录并封装返回一个对象(Object)
load 作用与get基本相同,不过只有在对该对象的数据实际调用时,才会去查询数据库
save 添加记录
saveOrUpdate 判断相应记录是否已存在,据此进行添加或修改记录
update 修改记录
delete 删除记录
HibernateTemplate介绍就到这里,接下来我们考虑其使用。
既然是Spring,我们当然要用到IOC了(不知道IOC?问谷老师去!),注入次序是:
DataSource ->
SessionFactory ->
HibernateTemplate ->
DAO
以下是相关代码:
applicationContext.xml
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/myDB"/>
<property name="username" value="root"/>
<property name="password" value="abc"/>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="annotatedClasses">
<list>
<value>dj.pojo.Plant</value>
</list>
</property>
<property name="hibernateProperties">
<value>
hibernate.dialect = org.hibernate.dialect.MySQLDialect
hibernate.show_sql = true
hibernate.format_sql = true
hbm2ddl.auto = create
</value>
</property>
</bean>
<bean id="hibernateTemplate"
class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<bean id="plantDao" class="dj.dao.PlantDao">
<property name="hibernateTemplate" ref="hibernateTemplate"/>
</bean>
PlantDao.java
public class PlantDao{
private HibernateTemplate hibernateTemplate;
public HibernateTemplate getHibernateTemplate() {
return hibernateTemplate;
}
public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
this.hibernateTemplate = hibernateTemplate;
}
public void save(Plant plant){
this.getHibernateTemplate().save(plant);
}
public static void main(String[] args){
ClassPathXmlApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
PlantDao pd=(PlantDao) ctx.getBean("plantDao");
Plant plant=new Plant();
plant.setName("data");
pd.save(plant);
}
}
这里的main方法主要是用于测试,当然更标准的测试需要使用Junit。注意在Spring中applicationContext默认是放在WEB-INF目录中,但为了测试方便我把它放在src里了。
因为所有DAO类中都会有HibernateTemplate的bean方法,于是
private HibernateTemplate hibernateTemplate;
public HibernateTemplate getHibernateTemplate() {
return hibernateTemplate;
}
public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
this.hibernateTemplate = hibernateTemplate;
}
这段代码就会大量重复。
考虑到复用性,我们将这段代码封装在独立的类中,让所有DAO类继承。不过这个类Spring已经有了,那就是HibernateDaoSupport(除此之外,HibernateDaoSupport也有SessionFactory的bean方法),于是PlantDao.java可以简化为:
PlantDao.java
public class PlantDao extends HibernateDaoSupport{
public void save(Plant plant){
this.getHibernateTemplate().save(plant);
}
public static void main(String[] args){
ClassPathXmlApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
PlantDao pd=(PlantDao) ctx.getBean("plantDao");
Plant plant=new Plant();
plant.setName("data");
pd.save(plant);
}
}
到目前为止,我们所使用的是XML的注入方式,那么如果用annotation呢?
如果实际测试一下,你会发现出现了类似底下的异常:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'plantDao' defined in file [E:\javaWorks\plantAtlas\WebRoot\WEB-INF\classes\dj\dao\PlantDao.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: 'sessionFactory' or 'hibernateTemplate' is required
它找不到SessionFactory或者HibernateTemplate,即SessionFactory或者HibernateTemplate没有注入给DAO类!
原因在于HibernateDaoSupport的setter方法前并没有加入@Resource这样的注解,并且它的所有bean方法都是不可改写的(final),这就相当于你的DAO类和HibernateTemplate都被实例化了(DAO实例化需要使用@Component注解)但DAO实例并没有被注入HibernateTemplate,即:
DataSource ->
SessionFactory ->
HibernateTemplate ,DAO
HibernateTemplate与DAO之间的注入关系断开了
解决此问题的方法是:
重写一个加入了
@Recource
的
HibernateDaoSupport
的替代类,让
DAO
类继承
以下是使用annotation方式注入的相关代码:
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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">
<context:annotation-config />
<context:component-scan base-package="dj.dao"/>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/myDB"/>
<property name="username" value="root"/>
<property name="password" value="abc"/>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="annotatedClasses">
<list>
<value>dj.pojo.Plant</value>
</list>
</property>
<property name="hibernateProperties">
<value>
hibernate.dialect = org.hibernate.dialect.MySQLDialect
hibernate.show_sql = true
hibernate.format_sql = true
hbm2ddl.auto = create
</value>
</property>
</bean>
<bean id="hibernateTemplate"
class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
</beans>
PlanteDao.java
@Component
public class PlantDao extends SuperDao{
public void save(Plant plant){
this.getHibernateTemplate().save(plant);
}
public static void main(String[] args){
ClassPathXmlApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
PlantDao pd=(PlantDao) ctx.getBean("plantDao");
Plant plant=new Plant();
plant.setName("sae");
pd.save(plant);
}
}
SuperDao.java
public class SuperDao {
private HibernateTemplate hibernateTemplate;
public HibernateTemplate getHibernateTemplate() {
return hibernateTemplate;
}
@Resource
public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
this.hibernateTemplate = hibernateTemplate;
System.out.println("hibernateTemplate is null:"+hibernateTemplate==null);
}
}
测试,ok!
到此算讲完了,这是我的第一篇关于程序开发的博客,欢迎各位拍砖。
以上!
分享到:
相关推荐
HibernateTemplate 是 Spring 提供的一个模板类,它封装了对 Hibernate Session 的操作,避免了直接与 Session 进行交互时出现的事务管理、异常处理等问题。HibernateTemplate 提供了一组丰富的静态方法,涵盖了大...
在Java开发领域,尤其是Spring框架的应用中,`HibernateDaoSupport`和`@Autowired`是两个非常重要的概念。它们分别代表了Hibernate对DAO层的支持以及Spring框架的依赖注入机制。接下来,我们将深入探讨这两个知识点...
《Spring框架下HibernateDaoSupport的深度解析与应用》 在Java企业级开发中,Spring框架以其优秀的IoC(控制反转)和AOP(面向切面编程)特性,成为了事实上的标准。而Hibernate作为主流的对象关系映射(ORM)工具...
通过上述步骤,我们了解了如何使用`hibernateDaoSupport`类来简化Hibernate与Spring的集成。这种方法不仅提高了代码的可读性和可维护性,还大大减少了开发过程中的错误可能。在实际开发过程中,开发者可以根据项目...
本文将深入探讨如何利用Spring与Hibernate整合,通过两种不同的方式来实现这些基本操作:HibernateTemplate和HibernateDaoSupport。 **一、HibernateTemplate** HibernateTemplate是Spring提供的一个方便的类,它...
以上就是关于Spring与Hibernate集成的关键知识点,包括基本配置、HibernateDaoSupport与UserDaoHibernateImpl的区别,以及Spring+Struts+Hibernate集成的具体实现细节。这些内容有助于更好地理解和运用Spring框架与...
- 配置 HibernateTemplate 或 HibernateDaoSupport,这两个类提供了对 Hibernate Session 的管理,使得业务层可以方便地调用。 3. **事务管理** - 在 `applicationContext.xml` 中配置事务管理器,如 `...
### HibernateDaoSupport与HibernateTemplate详解 #### 一、引言 在Java开发中,Spring框架与Hibernate框架的结合使用非常普遍。Spring框架以其强大的依赖注入(DI)和面向切面编程(AOP)功能,极大地简化了Java...
4. **HibernateTemplate与HibernateDaoSupport**:Spring提供了HibernateTemplate和HibernateDaoSupport,它们为DAO层提供了便捷的操作方法,如save、update、delete、find等,同时处理了事务和异常。 5. **JPA集成...
DataSource通常配置数据库连接信息,SessionFactory用于创建和管理Hibernate会话,而HibernateTemplate或HibernateDaoSupport则为DAO层提供了便捷的数据库操作接口。 4. Hibernate JAR文件解析 "hibernate_jar.rar...
1. **HibernateTemplate和HibernateDaoSupport**:Spring提供了一组Hibernate相关的工具类,如HibernateTemplate和HibernateDaoSupport,它们简化了Hibernate的使用。HibernateTemplate是一个模板类,它封装了许多...
为了简化Hibernate与Spring的整合,Spring提供了`HibernateTemplate`类,它是一个封装了Hibernate Session的工具类,使得在处理数据库操作时更加方便。`HibernateTemplate`在事务管理、异常转换等方面提供了很多便利...
### HibernateDaoSupport与JdbcDaoSupport详解 #### 一、概述 在软件开发过程中,特别是企业级应用开发中,数据库操作是一项重要的任务。为了简化这一过程并提高代码的可维护性和扩展性,Spring框架提供了多种支持...
在“Spring相关测试4”中,我们将重点探讨Spring框架如何与Hibernate ORM工具进行整合,特别是在使用HibernateTemplate和HibernateDaoSupport这两个关键组件时的不同版本测试。这将帮助我们了解如何在不同版本的...
【HibernateDaoSupport】是Spring框架中的一个抽象类,主要用于简化Hibernate的数据访问操作,它为DAO层提供了方便的事务管理和Session管理。这个类是Spring与Hibernate集成的重要组件,尤其对于初学者来说,理解其...
4. **Spring的HibernateTemplate或HibernateDaoSupport**:Spring提供了HibernateTemplate和HibernateDaoSupport类,用于简化Hibernate操作。在这个Demo中,可能会使用它们来封装数据访问操作。 5. **Entity(实体...
为了简化Hibernate与Spring的集成,Spring提供了HibernateTemplate类,它是Spring对Hibernate的一种封装,使得在DAO层操作数据库变得更加简便和安全。 首先,我们来看如何在DAO中使用HibernateTemplate。通常,DAO...
Hibernate 提供了 HibernateDaoSupport 和 HibernateTemplate 两个工具类来简化数据库操作。 HibernateDaoSupport 是 Spring 为 Hibernate DAO(数据访问对象)层提供的一个抽象基类,它并不直接执行数据库操作,...
- Spring提供了`HibernateTemplate`和`HibernateDaoSupport`工具类,方便我们在Service层操作数据库。`HibernateTemplate`可以直接注入到Service类中,而`HibernateDaoSupport`需要我们继承,并在子类中注入`...
`spring_integration_hibernate3_hibernateDaoSupport`和`spring_integration_hibernate3_basic`两个文件,展示了如何利用Spring的HibernateTemplate和HibernateDaoSupport类进行数据操作。这些类提供了一套简化...