使用HibernateTemplate
HibernateTemplate 可将Hibernate 的持久层访问模板化,使用HibernateTemplate 非常简单。创建Hi bernateTemplate 实例后,注入一个SessionFactory 的引用,就可执行持久化操作。SessionFactoyr 对象可通过构造参数传入,或通过设值方式传入。例如:
//获取Spring 上下文
ApplicationContext ctx = new FileSystemXmlApplicationContext("bean.xml");
//通过上下文获得SessionFactory
SessionFactory sessionFactory = (SessionFactory) ctx.getBean("sessionFactory") ,
HibernateTemplate 提供如下三个构造函数:
• HibernateTemplateO 。
• HibernateTemplate(org.hibernate.SessionFactory sessionFactory)。
• HibernateTemplate(org.hibernate.SessionFactory sessionFactory, boolean allowCreate) 。
第一个构造函数:构造一个默认的HibernateTemplate 实例,因此,使用HibernateTemplate实例之前,还必须使用方法setSessionFactory(SessionFactory sessionFactory)来为HibernateTemplate 传入SessionFactory 的引用。
第二个构造函数:在构造时已经传入SessionFactory 引用。
第三个构造函数:其boolean 型参数表明,如果当前线程己经存在一个非事务性的Session ,是否直接返回此非事务性的Session 。
对于在Web 应用中,通常启动时自动加载ApplicationContext , SessionFactory 和DAD对象都处在Spring 上下文管理下。因此无须在代码中显式设置,可采用依赖注入解耦SessionFactory 和DAO.
其依赖关系可通过配置文件来设置
<!-- Spring 配置文件的DTD 定义二〉
<!DOCTYPE beans PUBLIC "-!!SPRING!!DTD BEAN!!EN" ''http://www.springframework.org/dtd/spring-beans.dtd''>
<! -- Spring 配置文件的根元素是beans -->
< beans >
<!-- 定义数据源,该bean 的ID 为dataSource -->
< bean id =" dataSource" class =" org. springframework.jdbc. datasource. DriverManagerDataSource" >
<!-- 指定数据库驱动 -->
< property name ="driverClassName" >< value > com.mysql.jdbc.Driver </ value ></ property >
<!-- 指定连接数据库的URL -->
< property name ="url" >< value > jdbc:mysql://wonder:3306/j2ee </ value >
<! property >
<!-- root 为数据库的用户名 -->
< property name ="username" >< value > root </ value ></ property >
<!-- pass 为数据库密码 -->
< property name = "password" >< value > pass </ value ></ property >
</ bean >
<!-- 定义Hibernate 的SessionFactoy -->
< bean id ="sessionFactory" class ="org.springframework.orm.hibernate3.LocalSessionFactoryBean" >
<!-- 依赖注入数据源,注入正是上文定义的dataSource -->
< property name ="dataSource" >< ref local ="dataSource" /></ property >
<!-- mappingResouces属性用来列出全部映射文件〉
<property name="mappingResources">
<list>
<!--以下用来列出所有的PO 映射文件 -->
< value > lee/Person.hbm.xml </ value >
</ list >
</ property >
<!-- 定义Hibernate 的SessionFactory的属性 -->
< property name ="hibernateProperties" >
< props >
<!-- 指定Hibernate 的连接方言 -->
< prop key ="hibernate.dialect" > org.hibernate.dialect.MySQLDialect </ prop >
<!-- 不同数据库连接,启动时选择create , update , create-drop -->
< prop key ="hibernate.hbm2ddl.auto" > update </ prop >
</ props >
</ property >
</ bean >
<!-- 配置Person 持久化类的DAO bean -->
< bean id ="personDao" class ="lee.PersonDaoImpl" >
<!-- 采用依赖注入来传入SessionFactory的引用〉
<property name="sessionFactory"><ref local="sessionFactory"/></property>
</bean>
</beans>
在DAO 实现类中,可采用更简单的方式来取得HibemateTemplate的实例。代码如下:
... {
// 执行持久化操作的HibernateTemplate
HibernateTemplate ht;
private SessionFactory sessionFactory;
// 依赖注入Sess工onFactory 的必需的setter 方法
public void setSessionFactory(SessionFactory sessionFactory)
... {
this .sessionFactory = sessionFactory;
}
// 该方法用于完成HibernateTemplate的初始化
private void setHibernateTemplate()
... {
if (ht == null ) ... {
ht = new HibernateTemplate(sessionFactory);
}
}
/** */ /**
*加载Person 实例
* @param id 需要加载Person 实例的主键值
* @return 返回加载的Person 实例
*/
public Person get( int id) ... {
setHibernateTemplate();
return (Person)ht.get(Person. class , new Integer(id));
}
/** */ /**
*保存Person 实例
* @param person 需要保存的Person 实例
*/
public void save(Person person) ... {
setHibernateTemplate() ;
ht.save(person) ;
}
/** */ /**
*修改Person 实例
* @param person 需要修改的Person 实例
*/
public void update(Person person) ... {
setHibernateTemplate();
ht.update(person);
}
/** */ /**
*删除Person 实例
* @param id 需要删除的Person id
*/
public void delete( int id) ... {
setHibernateTemplate();
ht.delete(ht.get(Person. class , new Integer(id)));
}
/** */ /**
*删除Person 实例
* @param perso口需要删除的Person 实例
*/
public void delete(Person person) ... {
setHibernateTemplate();
ht.delete(person) ;
}
/** */ /**
*根据用户名查找Person
* @param name 用户名
* @return 用户名对应的全部用户
*/
public List findByPerson(String name) ... {
setHibernateTemplate();
return h t. find( " from Person p where p.name like ? " , name);
}
/** */ /**
*返回全部的Person 实例
* @return 全部的Person 实例
*/
public List findAllPerson() ... {
setHibernateTemplate();
return ht.find( " from Person " );
}
}