public class StudentDaoHibernate extends HibernateDaoSupport implements StudentDao{
.................
}
如果你选择这种设计,就需要动态注入SessionFactory而HibernateDaoSupport包含这个属性.这个类提供了一个方便的方法getHibernateTemplate(); 就能得到HibernateTemplate的一个实例.它也有getSession()和releaseSession,以便于你应为某些原因而不使用HibernateTempate的情况下执行Hibernate操作。
HibernateDaoSupport提供了基于AOP事务的自动处理,程序员完全可以不用理会事务的开始与提交。在JDBC中一个Connection对象使用一个事务,那么在Hibernate中一个事务肯定要关联一个SessionFactory了,然而这个SessionFactory却没有在DAO中体现。其实主要的原因是HibernateDaoSupport类已经默默地做了封装的工作,它用一个setSessionFactory方法将SessionFactory进行注入,所以继承自HibernateDaoSupport类的DAO都会具有SessionFactory的属性,从而可以通过SessionFactory创建Session实例操作数据库。
在继承HibrnateDaoSupport的DAO实现里,Hibernate Session的管理完全不需要Hibernate代码打开,而由Spring来管理。Spring会根据实际的操作,采用“每次事务打开一次session”的策略,自动提高数据库访问的性能。
由于Hibernate集成了JDBC,所以在访问数据库时,与直接使用JDBC访问数据库相比,Hibernate在连接、访问数据库时的代码减少了很大一大半。但由此而来也相应必须增加访问Hibernate配置文件和SessionFactory、Session的打开、关闭的代码。为了解决以上相同代码出现的复用问题,Hibernate对此又进行了再一次封装,于是,幸运地出现了HibernateDaoSupport。因此,在使用HibernateDaoSupport模板对数据库访问时,更加方便、简单,特别是进行简单的增删改查。
下面是我自己写的一点代码参考:
/**
* @author wifygoo
* 对企业信息的简单增删改查。
*/
public class EnterpriseDaoImpl extends HibernateDaoSupport implements
EnterpriseDao {
/**
* @param Enterprise
* 删除某条企业信息。
*/
public void del(Enterprise enterprise) {
this.getHibernateTemplate().delete(enterprise);
}
/**
* @return 所有的企业信息。
* 查询所有的企业信息。
*/
@SuppressWarnings("unchecked")
public List<Enterprise> findAllEnterprises() {
String hql = "from Enterprise enterprise";
return this.getHibernateTemplate().find(hql);
}
/**
* @param Integer,企业编号。
* @return 某个企业信息。
* 通过企业编号查询企业信息。
*/
public Enterprise findEnterpriseById(Integer id) {
return (Enterprise) this.getHibernateTemplate().load(Enterprise.class, id);
}
/**
* @param Enterprise
* 添加企业信息。
*/
public void save(Enterprise enterprise) {
this.getHibernateTemplate().save(enterprise);
}
/**
* @param Enterprise
* 修改企业信息。
*/
public void update(Enterprise enterprise) {
this.getHibernateTemplate().update(enterprise);
}
}