Spring中对Hibernate 的简单封装原理

微笑开篇提示:本文以spring2.5.6为基准展开,如文中有误欢迎指出。

疑问开篇大家可以思考一些问题:

1、spring中对于hibernate的整合是怎样的?

2、spring为什么要对hibernate做进一步的封装?这样做的好处是什么?

***************************************************************************************************************

我的讲解需要引用spring2.5.6的代码,为了省空间这里不给粘贴源码了,源码位置:spring.jar-->org.springframework.orm.hibernate3.HibernateTemplate.java。

参考文档:spring docs  index.html--->第12章

需要提前了解的概念:模板模式Template Method、匿名内部类。

害羞谈谈我学习该知识点时的囧态吧:

       我学习这个地方的时候,是看马士兵老师的视频学的,版本可能老一点,没关系,学精髓就可以了。可是我怎么听也不明白,callback是什么东西,为啥又用到匿名内部类,这些跟hibernate的封装有啥鸟关系?!呵呵,到此你的思维千万不要被我拐了,主题还是HibernateTemplate.java,先不要管其他的。

好,我们从为啥要引入这个HibernateTemplate说起吧:

       原来使用sessionFactory.openSession();时你看看下面被注的代码中是不是很多行,而且这只是一个dao实现类就这样,那要是项目中有很多个这样的dao咋办,难道还要重复这些代码吗,你仔细观察就可以看到不管是不是同一个dao实现,不同的只有对数据库的操作,为了避免这种重复的体力劳动才引入模板这个概念,从而HibernateTemplate诞生了。现在好了,有了模板,不管你对数据库做啥都一句话搞定:template.方法名(u);

       到此为止,Spring中对Hibernate 的简单封装还没讲到呢,只是讲了讲人家封装完之后怎么用的,原理在该代码之后。

package com.wuf.spring.dao.impl;

import javax.annotation.Resource;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.stereotype.Component;
import com.wuf.spring.dao.UserDAO;
import com.wuf.spring.model.User;

@Component("userDAO")
public class UserDAOImpl implements UserDAO {
private HibernateTemplate template;
public HibernateTemplate getTemplate() {
return template;
}
@Resource
public void setTemplate(HibernateTemplate template) {
this.template = template;
}
//使用HibernateTemplate后的save方法
public void save(User u){
template.save(u);
}
//使用HibernateTemplate前的save方法
// 关于HibernateTemplate的实验代码,除了session.save(u);其他的都可以作为公共部分
// public void save(User u){
// Session session = null;
// try {
// session = sessionFactory.openSession();
// // session.beginTransaction();
// session.getTransaction().begin();
//
// session.save(u);// 这里可以是update、delete、insert,这里是变化的
//
// session.getTransaction().commit();
// } catch (HibernateException e) {
// e.printStackTrace();
// session.getTransaction().rollback();
// } finally {
// if (session != null) {
// session.close();
// session = null;
// }
// }
// }
}

封装原理:

就是将不变的部分封起来,想办法把变的部分通过方法弄进来。结合生活例子理解更简单一点:都做过试卷吧,一个考场好几十个呢,卷子刚发下来都是一样的没答案,这些一样的试卷就是模板,你只需要填答案就行了,因人不同所以答案可能不同,这里需要注意啊,重点是给考生的都是模板,不要纠结答案同不同。

       所以封装的原理就是模板,严格来说就是模板方法。这是一种设计模式,自己去查资料。

     来看一下spring是怎样实现的:

    //dao实现类里是模板类调save方法。这咋就体现了模板的概念呢,别急,他体现在模板类对save方法的实现 executeWithNativeSession方法上。

     public void save(User u){
template.save(u);
    }

     //HibernateTemplate中对save的实现,可以说executeWithNativeSession(..)就是模板

     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);
                        }
                });
         }

     //来看一下模板executeWithNativeSession是啥样子吧,下面这段代码是我自己模拟的,他的源码讲解起来又没玩没了了

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() {
return null;
}
public void save(final Object o) {
new MyHibernateTemplate().executeWithNativeSession(new MyHibernateCallback() {
public void doInHibernate(Session s) {
s.save(o);
}
});
}
}
事实上模板类不仅仅是实现save一个方法,spring的模板类HibernateTemplate将数据库操作的方法都实现了,这里HibernateTemplate把变化(即未知)的部分当参数传进来的,而spring又利用匿名内部类作为这个参数的载体,所以模板类、模板方法、匿名内部类就是这样的关系啦。其实就是一个抽取、传参的过程。

总结:开篇的第一个问题不在这里给予解答,那只是让你复习下spring对hibernate的整合,第二个问题回答就是省代码了,这也算是一种性能的提升吧。没有陌生的技巧,spring用的很巧妙。

提醒:不要忘了spring的注入,在beans.xml中写

<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值