Spring之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的使用:
- public class UserDAOImpl implements UserDAO {
- private HibernateTemplate hibernateTemplate;
- public HibernateTemplate getHibernateTemplate() {
- return hibernateTemplate;
- }
- public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
- this.hibernateTemplate = hibernateTemplate;
- }
- public void save(User user) {
- hibernateTemplate.save(user);
- }}
这基本上就是我们的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,我们就可以实现我们想要的功能了。
转载于:https://www.cnblogs.com/dengjiali/articles/3598637.html
Spring之HibernateTemplate 和HibernateDaoSupport相关推荐
- Java程序员从笨鸟到菜鸟之(八十一)细谈Spring(十)深入源码分析Spring之HibernateTemplate 和HibernateDaoSupport
spring提供访问数据库的有三种方式: HibernateDaoSupport HibernateTemplate(推荐使用) jdbcTemplate(我们一般不用) 类所在包: Hibernat ...
- HibernateTemplate、HibernateDaoSupport两种方法实现增删改查Good
Spring+Hibernate两种方法实现增删改查 首先,定义一个Customer的bean类,设置好Customer.hbm.xml文件.再定义好一个Dao接口.准备好一个jdbc.propert ...
- Spring中HibernateTemplate类的使用
实际情况中,对于编程事务的操作最好还是使用org.springframework.transaction.support.TransactionTemplate,因为HibernateTemplate ...
- Java程序员从笨鸟到菜鸟全部博客目录
本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.NET/csh624366188 欢迎关注微信账号:java那些事:csh624366188.每天一篇java相关的文章 大 ...
- Java程序员由笨鸟到菜鸟 电子版书正式发布 欢迎大家下载
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 欢迎关注 ...
- spring的HibernateDaoSupport以及HibernateTemplate和jdbcTemplate的选择问题
Xml代码 pring提供访问数据库的有三种方式: HibernateDaoSupport,HibernateTemplate(推荐使用),jdbcTemplate HibernateTempla ...
- Spring 的持久化实例(JDBC, JdbcTemplate、HibernateDaoSupport、JdbcDaoSupport、SqlSessionDaoSupport等)...
2019独角兽企业重金招聘Python工程师标准>>> 一.表(这里用mysql,数据库名为yiibai) CREATE TABLE `customer` (`CUST_ID` in ...
- eclipse 达梦 连接_达梦Hibernate Spring集成开发示例
[IT168 技术文档]DM是武汉华工达梦数据库有限公司推出的新一代高性能.高安全性的数据库产品.它具有开放的.可扩展的体系结构,高性能事务处理能力,以及低廉的维护成本.DM是完全自主开发的数据库软件 ...
- Spring.Net+NHibenate+Asp.Net mvc +ExtJs 系列 3 ----数据访问层
在上一篇中,我们已经搭建起了整个解决方案的项目,并且建好了数据库,完成了实体类和Nhibernate映射文件.在本文中,将定义数据访问接口,并利用Nhibernate实现接口,利用Spring.net ...
最新文章
- iso镜像文件烧写到U盘
- R语言ggplot2可视化散点图、可视化两个数值变量之间的关系、使用geom_smooth函数基于loess方法拟合数据点之间的趋势关系曲线、自定义数据点的大小、色彩、添加主标题、副标题、题注信息
- 百度研究院发布2021年十大科技趋势预测
- Redis第三集:redis-benchmark性能测试
- 12岁女孩零编程经验开发系统千人用,80岁初代程序员300多天打卡学AI
- 配置Linux的时钟同步
- config之安全(用户认证)
- [信息安全] 4.一次性密码 amp;amp;amp;amp; 身份认证三要素
- 【渝粤教育】国家开放大学2018年春季 8256-21T药物治疗学 参考试题
- mysql数学函数名_Mysql数学函数
- floyd求最小环 模板
- (转) RabbitMQ学习之发布/订阅(java)
- Linux:常用shell快捷键
- Spring Boot + JPA +MySQL 数据操作及示例环境搭建(手动建表建类)
- 我通过了 Google 技术面试,所以你也能行!
- 启动root用户 银河麒麟_银河麒麟Kydroid 2.0全新发布:原生支持海量安卓APP
- 友盟分享失败后有回调吗_友盟分享成功回调问题
- windows10 1909 X64位 精简优化珍藏版
- 透视相机(PerspectiveCamera)
- [OpenGL] L系统 分形树的实现(L-System植物建模)
热门文章
- ecshop获取客户端操作系统
- .NET Framework 如何:提高性能
- android onitemclicklistener 参数,android – OnItemClickListener从模型中获取数据
- java sql 登录失败_java – 接收连接到SQL Server 2008的SQLException“用户登录失败”
- 为什么传值时加号变成了空格_URL的参数中有加号传值变为空格的问题(URL特殊字符)...
- php workman 多线程,workerman如何多线程
- 基于PyMC的贝叶斯建模实战
- 少儿编程100讲轻松学python(十二)-python如何将数据写入txt
- sql 如何根据月份查询数据总数_什么是慢查询?如何通过慢查询日志优化?
- jQuery实现数据映入form表单