基於泛型的通用Dao介面和hibernate的實現

來源:互聯網
上載者:User

基於泛型的通用Dao介面:(主要是在使用hibernate或JPA時使用)

  1. package com.qiujy.dao;
  2. import java.io.Serializable;
  3. import java.util.List;
  4. /**
  5.  * 基於泛型的通用Dao介面
  6.  */
  7. public interface GenericDao<T> {
  8.     void create(T entity);
  9.     void delete(T entity);
  10.     void update(T entity);
  11.     
  12.     T findById(Serializable id);
  13.     List<T> findAll();
  14.     List<T> findList(int pageNo, int pageSize);
  15.     int getCountOfAll();
  16. }

hibernate對此泛型Dao介面的使用:

  1. package com.qiujy.dao.hibernate;
  2. import java.io.Serializable;
  3. import java.lang.reflect.ParameterizedType;
  4. import java.util.List;
  5. import org.hibernate.criterion.Projections;
  6. import com.qiujy.common.HibernateUtil;
  7. import com.qiujy.dao.GenericDao;
  8. /**
  9.  * Hibernate對泛型通用Dao介面的實現
  10.  */
  11. public class GenericHibernateDaoImpl<T> implements GenericDao<T> {
  12.     private Class<T> clazz;
  13.     @SuppressWarnings("unchecked")
  14.     public GenericHibernateDaoImpl() {
  15.         //通過反射擷取T的類型資訊執行個體
  16.         this.clazz = (Class<T>)((ParameterizedType)this.getClass().getGenericSuperclass())
  17.                             .getActualTypeArguments()[0];
  18.     }
  19.     public void create(T entity) {
  20.         HibernateUtil.getSession().save(entity);
  21.     }
  22.     public void delete(T entity) {
  23.         HibernateUtil.getSession().delete(entity);
  24.     }
  25.     
  26.     @SuppressWarnings("unchecked")
  27.     public void update(T entity) {
  28.         //HibernateUtil.getSession().saveOrUpdate(entity);
  29.         entity = (T) HibernateUtil.getSession().merge(entity);
  30.     }
  31.     @SuppressWarnings("unchecked")
  32.     public List<T> findAll() {
  33.         return HibernateUtil.getSession().createCriteria(clazz).list();
  34.     }
  35.     @SuppressWarnings("unchecked")
  36.     public List<T> findList(int pageNo, int pageSize) {
  37.         return HibernateUtil.getSession().createCriteria(clazz)
  38.                                          .setFirstResult((pageNo - 1) * pageSize)
  39.                                          .setMaxResults(pageSize)
  40.                                          .list();
  41.     }
  42.     public int getCountOfAll() {
  43.         Integer count = (Integer) HibernateUtil.getSession()
  44.                                                .createCriteria(clazz)
  45.                                                .setProjection(Projections.rowCount())
  46.                                                .uniqueResult();
  47.         if (null == count) {
  48.             return 0;
  49.         } else {
  50.             return count.intValue();
  51.         }
  52.     }
  53.     @SuppressWarnings("unchecked")
  54.     public T findById(Serializable id) {
  55.         return (T)HibernateUtil.getSession().load(clazz, id); //get
  56.     }
  57. }

 

使用泛型Dao介面:

 

  1. package com.qiujy.dao;
  2. import java.util.List;
  3. import com.qiujy.domain.Resource;
  4. /**
  5.  * Resource類的Dao介面
  6.  */
  7. public interface ResourceDao extends GenericDao<Resource> {
  8.     
  9.     public List<Resource> findResources(int status);
  10. }

使用hibernate的實現:

  1. package com.qiujy.dao.hibernate;
  2. import java.util.List;
  3. import com.qiujy.common.HibernateUtil;
  4. import com.qiujy.dao.ResourceDao;
  5. import com.qiujy.domain.Resource;
  6. public class ResourceDaoImpl extends GenericHibernateDaoImpl<Resource> implements ResourceDao {
  7.     @SuppressWarnings("unchecked")
  8.     public List<Resource> findResources(int status) {
  9.         
  10.         return (List<Resource>)HibernateUtil.getSession()
  11.                                     .createQuery("from Resource where status=:status")
  12.                                     .setInteger("status", status)
  13.                                     .list();
  14.     }
  15.     
  16. }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.