JAVA技巧:通用Dao接口和hibernate的實(shí)現(xiàn)

字號(hào):

基于泛型的通用Dao接口:(主要是在使用hibernate或JPA時(shí)使用)
    package com.qiujy.dao;
    import java.io.Serializable;
    import java.util.List;
    /**
    * 基于泛型的通用Dao接口
    */
    public interface GenericDao {
    void create(T entity);
    void delete(T entity);
    void update(T entity);
    T findById(Serializable id);
    List findAll();
    List findList(int pageNo, int pageSize);
    int getCountOfAll();
    }
    hibernate對(duì)此泛型Dao接口的使用:
    package com.qiujy.dao.hibernate;
    import java.io.Serializable;
    import java.lang.reflect.ParameterizedType;
    import java.util.List;
    import org.hibernate.criterion.Projections;
    import com.qiujy.common.HibernateUtil;
    import com.qiujy.dao.GenericDao;
    /**
    * Hibernate對(duì)泛型考試,大提示通用Dao接口的實(shí)現(xiàn)
    */
    public class GenericHibernateDaoImpl implements GenericDao {
    private Class clazz;
    @SuppressWarnings("unchecked")
    public GenericHibernateDaoImpl() {
    //通過(guò)反射獲取T的類(lèi)型信息實(shí)例
    this.clazz = (Class)((ParameterizedType)this.getClass().getGenericSuperclass())
    .getActualTypeArguments()[0];
    }
    public void create(T entity) {
    HibernateUtil.getSession().save(entity);
    }
    public void delete(T entity) {
    HibernateUtil.getSession().delete(entity);
    }
    @SuppressWarnings("unchecked")
    public void update(T entity) {
    //HibernateUtil.getSession().saveOrUpdate(entity);
    entity = (T) HibernateUtil.getSession().merge(entity);
    }
    @SuppressWarnings("unchecked")
    public List findAll() {
    return HibernateUtil.getSession().createCriteria(clazz).list();
    }
    @SuppressWarnings("unchecked")
    public List findList(int pageNo, int pageSize) {
    return HibernateUtil.getSession().createCriteria(clazz)
    .setFirstResult((pageNo - 1) * pageSize)
    .setMaxResults(pageSize)
    .list();
    }
    public int getCountOfAll() {
    Integer count = (Integer) HibernateUtil.getSession()
    .createCriteria(clazz)
    .setProjection(Projections.rowCount())
    .uniqueResult();
    if (null == count) {
    return 0;
    } else {
    return count.intValue();
    }
    }
    @SuppressWarnings("unchecked")
    public T findById(Serializable id) {
    return (T)HibernateUtil.getSession().load(clazz, id); //get
    }
    }
    使用泛型Dao接口:
    package com.qiujy.dao;
    import java.util.List;
    import com.qiujy.domain.Resource;
    /**
    * Resource類(lèi)的Dao接口
    */
    public interface ResourceDao extends GenericDao {
    public List findResources(int status);
    }
    使用hibernate的實(shí)現(xiàn):
    package com.qiujy.dao.hibernate;
    import java.util.List;
    import com.qiujy.common.HibernateUtil;
    import com.qiujy.dao.ResourceDao;
    import com.qiujy.domain.Resource;
    public class ResourceDaoImpl extends GenericHibernateDaoImpl implements ResourceDao {
    @SuppressWarnings("unchecked")
    public List findResources(int status) {
    return (List)HibernateUtil.getSession()
    .createQuery("from Resource where status=:status")
    .setInteger("status", status)
    .list();
    }
    }