转自:https://blog.csdn.net/yz9612/article/details/80234377

springhibernate的DAO提供工具类:HibernateDaoSupport。该类主要提供如下两个方法,方便DAO的实现:    public final HibernateTemplate getHibernateTemplate()

public final void setSessionFactory(SessionFactory sessionFactory)

其中,setSessionFactory方法用来接收Spring的ApplicationContext的依赖注入,可接收配置在Spring的SessionFactory实例,getHibernateTemplate方法则用来根据刚才的SessionFactory产生Session,最后生成HibernateTemplate来完成数据库访问。

典型的继承HibernateDaoSupport的DAO实现的代码如下:

public class PersonDAOHibernate extends HibernateDaoSupport implements PersonDAO

{

//采用log4j来完成调试时的日志功能

private static Log log = LogFactory.getLog(NewsDAOHibernate.class);

//返回全部的人的实例

public List getPersons()

{

//通过HibernateTemplate的find方法返回Person的全部实例

return getHibernateTemplate().find("from Person");

}

/**

* 根据主键返回特定实例

* @ return 特定主键对应的Person实例

* @ param 主键值

public News getPerson(int personid)

{

return (Person)getHibernateTemplate().get(Person.class, new Integer(personid));

}

/**

* @ person 需要保存的Person实例

*/

public void savePerson(Person person)

{

getHibernateTemplate().saveOrUpdate(person);

}

/**

* @ param personid 需要删除Person实例的主键

* /

public void removePerson(int personid)

{

//先加载特定实例

Object p = getHibernateTemplate().load(Person.class, new Integer(personid));

//删除特定实例

getHibernateTemplate().delete(p);

}

}

可以与前面的PersonDAOHibernate对比,会发现代码量大大减少。事实上,DAO的实现依然借助于HibernateTemplate的模板访问方式,只是,HibernateDaoSupport将依赖注入SessionFactory的工作已经完成,获取HibernateTemplate的工作也已完成。该DAO的配置必须依赖于SessionFactory,具体的配置如下:

<?xml version="1.0" encoding="gb2312"?>

<!--  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的SessionFactory-->

<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. PersonDAOHibernate">

<!--  采用依赖注入来传入SessionFactory的引用>

<property name="sessionFactory"><ref local="sessionFactory"/></property>

</bean>

</beans>

程序中可以通过显式的编码来获得personDAO bean,然后执行CRUD操作。也可通过依赖注入,将personDAO的实例注入其他bean属性,再执行CRUD操作。

在继承HibrnateDaoSupport的DAO实现里,Hibernate Session的管理完全不需要Hibernate代码打开,而由Spring来管理。Spring会根据实际的操作,采用“每次事务打开一次session”的策略,自动提高数据库访问的性能。

最新文章

  1. 通过GCC编译器编译c语言
  2. windows 2003 企业版 下载地址+序列号
  3. React Native学习-CameraRoll
  4. 大型分布式C++框架《二:大包处理过程》
  5. jdk自带的动态代理
  6. documentsUI源码分析
  7. enum(枚举类型)
  8. msyql存储数据时字段被截断
  9. 雷林鹏分享:jQuery EasyUI 插件
  10. Java学习——Applet画8个同心圆
  11. Spring Boot安装及入门实现
  12. Excel 整个列数字转换成文本
  13. 每日Scrum(8)
  14. 008.KVM-VNC管理
  15. React Native布局
  16. sql优化 慢查询分析
  17. rabbitmq 消息的状态转换
  18. asp.net excel导出功能
  19. Spark机器学习8&#183; 文本处理(spark-shell)
  20. &lt;正则吃饺子&gt; :关于redis集群的搭建、集群测试、搭建中遇到的问题总结

热门文章

  1. 【文献阅读】Stack What-Where Auto-encoders -ICLR-2016
  2. Python学习总结之二 -- 数据类型
  3. ubuntu 中文显示乱码问题 (转)
  4. Easy AR简单教程
  5. 早一天把生意做到de
  6. 操作符表示指针指向的底层值 切片 nill 清空 按值引用赋值 获取地址赋值
  7. 【题解】CF559C C. Gerald and Giant Chess(容斥+格路问题)
  8. 【linux】新添加一块硬盘制作LVM卷并进行分区挂载
  9. 剑指Offer:二叉搜索树的后序遍历序列【33】
  10. 剑指Offer:删除链表的节点【18】