首页 > 开发 > 综合 > 正文

使用模板模式简化DAO操作Hibernate

2024-07-21 02:15:10
字体:
来源:转载
供稿:网友
  相信使用过spring + hibernate开发过的人,在写dao的时候都使用过spring的hibernatedaosupport类,然后在实现的时候就可以很轻松的使用gethibernatetemplate()方法之后就可以调用save()、delete()、update()等hibernate的session的操作,很简单。比如:

gethibernatetemplate().save(user);


  这样一句话在我们没有spring的时候就必须使用如下的代码才能完成:

session session = hibernateutil.getsession();
transaction tx = session.begintransaction();
session.save(user);
tx.commit();
hibernateutil.colsesession();


  这里还省去了异常处理,同时使用了hibernateutil类来简化从sessionfactory获取session,以及关闭session等处理。

  但是我们在使用hibernate的时候不一定会使用spring,所以我们可以模仿spring的处理方式,做一个hibernate的模板,使用模板模式来简化我们的开发,其主要的目的就是为了简化开发,使代码达到最大话的重用。

  1. 我们现来实现一个hibernate模板:

package kick.hibernate;

import net.sf.hibernate.hibernateexception;
import net.sf.hibernate.session;
import net.sf.hibernate.transaction;

public class hibernatetemplate{
public static object run(hibernatecallback callback) throws hibernateexception{
session session = null;
transaction tx = null;
try {
session = hibernatesessionutil.currentsession();
tx = session.begintransaction();
object result = callback.execute(session);
tx.commit();
session.flush();
return result;
} catch (hibernateexception e) {
tx.rollback();
return null;
} finally {
hibernatesessionutil.closesession();
}
}


  这里类很简单,就是使用一个实现hibernatecallback接口的一个回掉类,在调用的时候根据具体的需求实现hibernatecallback类。

  2. 回掉接口hibernatecallback:

package kick.hibernate;

import net.sf.hibernate.hibernateexception;
import net.sf.hibernate.session;

public interface hibernatecallback {
object execute(session session)throws hibernateexception;
}


  好了,到此为止我们就可以使用这个模板了,可以用如下的方式使用:

hibernatetemplate.run(new hibernatecallback() {
public object execute(session session) throws hibernateexception {
session.save(user);
return null;
}
});


  看看,是不是省去了很多代码?

  不过这还没有达到想spring里面那样简单,不要着急,“面包会有的”,我们会达到的。

  3. 实现我们自己的hibernatesupport类
  从上面的代码可以看出,我们要自己实现hibernatecallback接口,而每次我们实现的时候又重复代码了。因此我们再抽象,讲这些实现放到我们的hibernatesupport类里面去。看看我们上面的代码就知道我们实现hibernatecallback接口的目的就是为了调用session.save()方法,即session的方法。代码如下:(点击查看附件

  4. 抽象rootdao:
  该类为抽象类,在实现自己的dao类的时候继承该类。该类的有一个hibernatesupport的对象,在子类中使用gethibernatetemplate()方法就可以得到该对象,然后调用它对应的方法。实现代码如下:

package kick.hibernate.dao;

import net.sf.hibernate.session;
import kick.hibernate.hibernatetemplateimpl;

public abstract class rootdao {
private hibernatesupport temp = null;

/**
* @return returns the temp.
*/
public hibernatetemplateimpl gethibernatetemplate(session session) {
return new hibernatesupport();
}
}



  5. 使用例子:
  定义一个自己的dao类,实现代码如下:

public class userdaoimpl extends rootdao implements userdaointerface{
public void saveuser(user user) throws kickexception {
gethibernatetemplate().saveorupdate(user);
}
…………………………………………
实现其他的方法
…………………………………………
}

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表