相信使用过Spring + Hibernate开发过的人在写DAO的时候都使用过Spring的HibernateDaoSupport类然后在实现的时候就可以很轻松的使用getHibernateTemplate()方法之后就可以调用save()delete()update()等Hibernate的Session的操作很简单比如
getHibernateTemplate()save(user);
这样一句话在我们没有Spring的时候就必须使用如下的代码才能完成
Session session = HibernateUtilgetSession();
Transaction tx = sessionbeginTransaction();
sessionsave(user);
mit();
lseSession();
这里还省去了异常处理同时使用了HibernateUtil类来简化从SessionFactory获取Session以及关闭Session等处理
但是我们在使用Hibernate的时候不一定会使用Spring所以我们可以模仿Spring的处理方式做一个Hibernate的模板使用模板模式来简化我们的开发其主要的目的就是为了简化开发使代码达到最大话的重用
.我们现来实现一个Hibernate模板
package kickhibernate;
import netsfhibernateHibernateException;
import netsfhibernateSession;
import netsfhibernateTransaction;
public class HibernateTemplate{
public static Object run(HibernateCallback callback) throws HibernateException{
Session session = null;
Transaction tx = null;
try {
session = HibernateSessionutilcurrentSession();
tx = sessionbeginTransaction();
Object result = callbackexecute(session);
mit();
sessionflush();
return result;
} catch (HibernateException e) {
txrollback();
return null;
} finally {
HibernateSessionutilcloseSession();
}
}
这里类很简单就是使用一个实现HibernateCallBack接口的一个回掉类在调用的时候根据具体的需求实现HibernateCallBack类
.回掉接口HibernateCallBack
package kickhibernate;
import netsfhibernateHibernateException;
import netsfhibernateSession;
public interface HibernateCallBack {
Object execute(Session session)throws HibernateException;
}
好了到此为止我们就可以使用这个模板了可以用如下的方式使用
HibernateTemplaterun(new HibernateCallback() {
public Object execute(Session session) throws HibernateException {
sessionsave(user);
return null;
}
});
看看是不是省去了很多代码?^_^
不过这还没有达到想Spring里面那样简单不要着急面包会有的呵呵我们会达到的
.实现我们自己的HibernateSupport类
从上面的代码可以看出我们要自己实现HibernateCallback接口而每次我们实现的时候又重复代码了因此我们再抽象讲这些实现放到我们的HibernateSupport类里面去看看我们上面的代码就知道我们实现HibernateCallback接口的目的就是为了调用sessionsave()方法即session的方法代码如下
package kickhibernate;
import javaioSerializable;
import netsfhibernateHibernateException;
import netsfhibernateSession;
public class HibernateSupport{
public Object save(final Object object) throws HibernateException{
return HibernateTemplaterun(new HibernateCallBack(){
public Object execute(Session session) throws HibernateException {
sessionsave(object);
return null;
}
});
}
public Object save(final Object objectfinal Serializable id) throws HibernateException{
return HibernateTemplaterun(new HibernateCallBack(){
public Object execute() throws HibernateException {
sessionsave(objectid);
return null;
}
});
}
public Object saveOrUpdate(final Object object) throws HibernateException{
return HibernateTemplaterun(new HibernateCallBack(){
public Object execute(Session session) throws HibernateException {
sessionsaveOrUpdate(object);
return null;
}
});
}
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
调用一些其他的session的方法
}
.抽象RootDao
该类为抽象类在实现自己的DAO类的时候继承该类该类的有一个HibernateSupport的对象在子类中使用getHibernateTemplate()方法就可以得到该对象然后调用它对应的方法实现代码如下
package kickhibernatedao;
import netsfhibernateSession;
import kickhibernateHibernateTemplateImpl;
public abstract class RootDao {
private HibernateSupport temp = null;
/**
* @return Returns the temp
*/
public HibernateTemplateImpl getHibernateTemplate(Session session) {
return new HibernateSupport();
}
}
.使用例子
定义一个自己的DAO类实现代码如下
public class UserDaoImpl extends RootDao implements UserDaoInterface{
public void saveUser(User user) throws KickException {
getHibernateTemplate()saveOrUpdate(user);
}
……………………………………………………………………………………
实现其他的方法
……………………………………………………………………………………
}
看到没有?红色的代码就实现了Spring的HibernateSupport了吧?^_^