封装 Hibernate 的通用 DAO

09/02/2010

Hibernate 框架作为一个优秀的持久化层轻量级框架具有很大优势,通过一个通用的DAO封装,我们将 Hibernate 相关的代码隐藏起来。
1.利用 MyEclipse 引入 Hibernate 框架 并自动创建 HibernateSessionFactory
2.封装 Hibernate 的通用DAO类

package cn.net.royakon.dao;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Example;

/**
 * 使用 HibernateSessionFactory 创建的通用DAO
 * 本类为 抽象类 业务DAO 均继承此类
 * 得到记录集合的操作仅支持精确过滤
 * 模糊查询需要业务DAO自行编写
 * @author RoyAkon
 */
abstract public class BaseHibernateDAO {

	/**
	 * 得到Session
	 * @return
	 */
	public Session getSession() {
		return HibernateSessionFactory.getSession();
	}

	/**
	 * 关闭Session
	 */
	public void closeSession() {
		HibernateSessionFactory.closeSession();
	}

	/**
	 * 实现增加数据库记录的操作
	 * @param item
	 */
	protected void add(Object item){
		try {
        	Transaction tx = getSession().beginTransaction();
        	getSession().save(item);
        	tx.commit();
        } catch (RuntimeException re) {
            throw re;
        } finally{
        	this.closeSession();
        }
	}

	/**
	 * 实现根据主键取得某条记录的操作
	 * @param id
	 * @param clazz
	 * @return
	 */
	protected Object get(java.io.Serializable id,Class clazz){
		try {
			Object item = getSession().get(clazz, id);
			return item;
        } catch (RuntimeException re) {
            throw re;
        } finally{
        	this.closeSession();
        }
	}

	/**
	 * 实现根据主键删除记录的操作
	 * @param id
	 * @param clazz
	 */
	protected void del(java.io.Serializable id,Class clazz){
		Transaction tx = null;
		try {
        	tx = getSession().beginTransaction();
        	getSession().delete(this.get(id, clazz));
        	tx.commit();
        } catch (RuntimeException re) {
            tx.rollback();
        	throw re;
        }	 finally{
        	this.closeSession();
        }
	}

	/**
	 * 实现更新记录的操作
	 * @param item
	 */
	protected void update(Object item){
		try {
        	Transaction tx = getSession().beginTransaction();
        	getSession().update(item);
        	tx.commit();
        } catch (RuntimeException re) {
            throw re;
        } finally{
        	this.closeSession();
        }
	}

	/**
	 * 实现根据条件精确过滤取得结果集的操作
	 * @param condition
	 * @param clazz
	 * @return
	 */
	protected List search(Object condition,Class clazz){
		try {
            List results = getSession()
                    .createCriteria(clazz)
                   .add(Example.create(condition))
            .list();
            return results;
        } catch (RuntimeException re) {
            throw re;
        } finally{
        	this.closeSession();
        }
	}
}

3.业务 DAO 的编写

package cn.net.royakon.dao;

import cn.net.royakon.entity.User;

/**
 * 业务DAO 继承自 BaseHibernateDAO
 * @author RoyAkon
 *
 */
public class User extends BaseHibernateDAO {

	/**
	 * 添加用户
	 * @param user
	 */
	public void addUser(User user) {
		super.add(user);
	}
}

大家可以看到,在具体到业务实现时,用户业务DAO的编写实现完全隐藏 Hibernate 代码。DAO代码是不是清爽无比?