基于泛型的通用Dao接口和hibernate的实现

基于泛型的通用Dao接口:(主要是在使用hibernate或JPA时使用)


package  com.qiujy.dao;
import java.io.Serializable;
import java.util.List;

public interface  GenericDao<T> {
    void create(T entity);
    void delete(T entity);
    void update(T entity);
        
    T findById(Serializable id);
    List<T> findAll();
    List<T> findList(int pageNo, int pageSize);
    int getCountOfAll();
}





hibernate对此泛型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对泛型通用Dao接口的实现
 */
public class GenericHibernateDaoImpl<T> implements GenericDao<T> {


    private Class<T> clazz;


    @SuppressWarnings("unchecked")
    public GenericHibernateDaoImpl() {
        //通过反射获取T的类型信息实例
        this.clazz = (Class<T>)((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<T> findAll() {
        return HibernateUtil.getSession().createCriteria(clazz).list();
    }


    @SuppressWarnings("unchecked")
    public List<T> 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类的Dao接口
*/
public interface ResourceDao extends GenericDao<Resource> {
    public List<Resource> findResources(int status);
}



使用hibernate的实现:

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<Resource> implements ResourceDao {

    @SuppressWarnings("unchecked")
    public List<Resource> findResources(int status) {
      
        return (List<Resource>)HibernateUtil.getSession().createQuery("from Resource where status=:status").setInteger("status", status).list();
    }
}

你可能感兴趣的:(java,DAO,Hibernate,jpa)