程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Spring+Hibernate實現的DAO層公共類

Spring+Hibernate實現的DAO層公共類

編輯:關於JAVA

此EntityDao接口與EntityDaoImpl實現類,可取代了我們平時寫的UserDao,NewsDao,CompanyDao等等,可直接供Service層調用.其中實現類的代碼如下:

/** 
  * Copyright 2009-1012 the original author or authors.
  * My Blog site: http://www.blogjava.net/rongxh7
  */

package rong.common.dao;
import java.io.Serializable;
import java.sql.SQLException;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.stereotype.Repository;
import rong.common.utils.Pager;
import rong.util.MyHibernateDaoSupport;

/** *//**
  * Dao層接口的實現類
  * 許多人習慣根據不多的業務邏輯定義不同的DAO層接口,如UserDao,NewsDao,CompanyDao等等,
  * 這樣往往使得編碼量十分龐大,而且帶來了維護的困難,因此,抽取此DAO層接口,收錄大部分
  * DAO層必須的方法,以供Service層調用。
  * @author rongxinhua
  * @version 1.0
  * @param <T> 范型,指實體類
  * @param <PK> 范型,指實體類主鍵的數據類型,如Integer,Long
  * @see rong.common.dao.EntityDao
  */

@Repository(value="entityDao")
public class EntityDaoImpl<T,PK extends Serializable> extends MyHibernateDaoSupport implements EntityDao<T, PK>{

    /** *//**
     * 保存實體
     * 包括添加和修改
     * @param t 實體對象
     */
    public void saveOrUpdate(T t){
        getHibernateTemplate().saveOrUpdate(t);
    }

    /** *//**
     * 更新實體
     * 可用於添加、修改、刪除操作
     * @param hql 更新的HQL語句
     * @param params 參數,可有項目或多項目,代替Hql中的"?"號
     */
    public void update(final String hql,final Object params){
        getHibernateTemplate().execute(new HibernateCallback(){

            public Object doInHibernate(Session session)
                    throws HibernateException, SQLException {
                Query query = session.createQuery(hql);
                for(int i=0; i<params.length; i++){
                    query.setParameter(i, params[i]);
                }
                query.executeUpdate();
                return null;
            }
        });
    }

    /** *//**
     * 刪除實體
     * @param t 實體對象
     */
    public void delete(T t){
        getHibernateTemplate().delete(t);
    }

    /** *//**
     * 刪除實體
     * @param entityClass 實體類名
     * @param id 實體的ID
     */
    public void delete(Class<T> entityClass,PK id){
        getHibernateTemplate().delete(get(entityClass,id));
    }

    /** *//**
     * 單查實體
     * @param entityClass 實體類名
     * @param id 實體的ID
     * @return 實體對象
     */
    @SuppressWarnings("unchecked")
    public T get(Class<T> entityClass,PK id){
        return (T)getHibernateTemplate().get(entityClass, id);
    }

    /** *//**
     * 查詢全部記錄列表
     * @param entityClass 實體類名
     * @param propertyName 排序的參照屬性
     * @param isAsc 排序方式
     * @param criterions 查詢條件,可為0項或任意多項目
     * @return 記錄List集
     */
    public List<T> findAll(final Class<T> entityClass,final String propertyName,final boolean isAsc,final Criterion criterions){
        int firstResult = 0;
        int maxResults = 0; //設置為0,則表示查詢全部記錄
        return findByCriteria(entityClass, propertyName, isAsc, firstResult, maxResults, criterions);
    }

    /** *//**
     * 查詢列表
     * @param entityClass 實體類名
     * @param propertyName 排序的參照屬性
     * @param isAsc 排序方式,true表示升序,false表示降序,當propertyName賦值為null時,此參數無效
     * @param firstResult 開始記錄序號
     * @param maxResults 最大記錄數
     * @param criterions 查詢條件,可有0項或任意多項目
     * @return 記錄List集
     */
    @SuppressWarnings("unchecked")
    public List<T> findByCriteria(final Class<T> entityClass,final String propertyName,final boolean isAsc,final int firstResult,final int maxResults,final Criterion criterions){
        List<T> list = (List<T>)getHibernateTemplate().execute(new HibernateCallback(){

            public Object doInHibernate(Session session)
                    throws HibernateException, SQLException {
                Criteria criteria = session.createCriteria(entityClass);
                //按屬性條件查詢
                for(Criterion criterion : criterions){
                    criteria.add(criterion);
                }
                //按某個屬性排序
                if(null != propertyName){
                    if(isAsc){
                        criteria.addOrder(Order.asc(propertyName));
                    }else{
                        criteria.addOrder(Order.desc(propertyName));
                    }
                }
                //用於分頁查詢
                if(maxResults != 0){
                    criteria.setFirstResult(firstResult);
                    criteria.setMaxResults(maxResults);
                }
                List<T> list = criteria.list();
                return list;
            }
        });
        return list;
    }

    /** *//**
     * 查詢總記錄數
     * @param entityClass 實體類名
     * @param criterions 查詢條件,可有0項或任意多項
     * @return 總記錄數
     */
    public int findCountsByCriteria(final Class<T> entityClass,final Criterion criterions){
            int totalCounts = (Integer)getHibernateTemplate().execute(new HibernateCallback(){

            public Object doInHibernate(Session session)
                    throws HibernateException, SQLException {
                Criteria criteria = session.createCriteria(entityClass);
                //按屬性條件查詢
                for(Criterion criterion : criterions){
                    criteria.add(criterion);
                }
                int totalCounts = criteria.list().size();
                return totalCounts;
            }
        });
        return totalCounts;
    }

    /** *//**
     * 分頁查詢
     * @param entityClass 實體類名
     * @param propertyName 排序參照屬性
     * @param isAsc 排序方式,true表示升序,false表示降序,當propertyName賦值為null時,此參數無效
     * @param firstResult 開始記錄序號
     * @param maxResults 最大記錄數
     * @param criterions 查詢條件,可為0項或任意多項目
     * @return 封裝List和totalCounts的Pager對象
     */
    @SuppressWarnings("unchecked")
    public Pager<T> findForPager(final Class<T> entityClass,final String propertyName,final boolean isAsc,final int firstResult,final int maxResults,final Criterion criterions){
        int totalCounts = findCountsByCriteria(entityClass, criterions);
        List<T> entityList = findByCriteria(entityClass, propertyName, isAsc, firstResult, maxResults, criterions);
        Pager pager = new Pager();
        pager.setTotalCounts(totalCounts);
        pager.setEntityList(entityList);
        return pager;
    }

    /** *//**
     * 根據屬性值查詢列表
     * @param entityClass 實體類名
     * @param propertyName 屬性名
     * @param value 屬性值
     * @return List列表
     */
    public List<T> findByProperty(Class<T> entityClass,String propertyName,Object value){
        Criterion criterion = Restrictions.eq(propertyName, value);
        List<T> list = findAll(entityClass, null, true, criterion);
        return list;
    }

    /** *//**
     * 根據屬性值查詢單個對象
     * @param entityClass 實體類名
     * @param propertyName 屬性名
     * @param value 屬性值
     * @return 實體對象
     */
    @SuppressWarnings("unchecked")
    public T findUniqueByProperty(final Class<T> entityClass,final String propertyName,final Object value){
        T t = (T)getHibernateTemplate().execute(new HibernateCallback(){

            public Object doInHibernate(Session session)
                    throws HibernateException, SQLException {
                Criteria criteria = session.createCriteria(entityClass).add(Restrictions.eq(propertyName, value));
                T t = (T)criteria.uniqueResult();
                return t;
            }
        });
        return t;
    }

    /** *//**
     * 根據屬性值查詢實體是否存在
     * @param entityClass 實體類名
     * @param propertyName 參照的屬性名
     * @param value 屬性值
     * @return 存在則返回true,不存在則返回false
     */
    public boolean isPropertyExist(final Class<T> entityClass,final String propertyName,final Object value){
        boolean isExist = (Boolean)getHibernateTemplate().execute(new HibernateCallback(){

            public Object doInHibernate(Session session)
                    throws HibernateException, SQLException {
                Criteria criteria = session.createCriteria(entityClass).add(Restrictions.eq(propertyName, value));
                boolean isEmpty = criteria.list().isEmpty();
                return ! isEmpty;
            }
        });
        return isExist;
    }

    /** *//**
     *
     * @param hql 查詢語句
     * 用法如:可用於登錄驗證時,根據用戶名、密碼等信息查詢用戶
     * @param params 參數數組,代替HQL中的"?"號,可有0項目或多項
     * @return 唯一實體,返回null則表示不存在配置的實體
     * @exception 如果查詢的結果集不唯一,則拋異常
     */
    @SuppressWarnings("unchecked")
    public T findUniqueByHql(final String hql, final Object params ){

        T t = (T)getHibernateTemplate().execute(new HibernateCallback(){

            public Object doInHibernate(Session session)
                    throws HibernateException, SQLException {
                Query query = session.createQuery(hql);
                for(int i=0; i<params.length; i++){
                    query.setParameter(i, params[i]);
                }
                T t = (T)query.uniqueResult();
                return t;
            }
        });
        return t;
    }

    /** *//**
     * 按HQL條件查詢列表
     * @param hql 查詢語句,支持連接查詢和多條件查詢
     * @param params 參數數組,代替hql中的"?"號
     * @return 結果集List
     */
    @SuppressWarnings("unchecked")
    public List<T> findByHql(String hql,Object params){
        List list = getHibernateTemplate().find(hql, params);
        return list;
    }

    /** *//**
     * 按HQL分頁查詢
     * @param firstResult 開始記錄號
     * @param maxResults 最大記錄數
     * @param hql 查詢語句,支持連接查詢和多條件查詢
     * @param params 參數數組,代替餐hql中的"?"號
     * @return 封裝List和total的Pager對象
     */
    @SuppressWarnings("unchecked")
    public Pager<T> findForPagerByHql(final int firstResult, final int maxResults, final String hql, final Object params){
        Pager<T> pager = (Pager<T>)getHibernateTemplate().execute(new HibernateCallback(){

            public Object doInHibernate(Session session)
                    throws HibernateException, SQLException {
                Query query = session.createQuery(hql);
                for(int position = 0; position < params.length; position ++){
                    query.setParameter(position, params[position]);
                }
                int totalCounts = query.list().size(); //總記錄數
                //用於分頁查詢
                if(maxResults > 0){
                    query.setFirstResult(firstResult);
                    query.setMaxResults(maxResults);
                }
                List<T> list = query.list();
                Pager<T> pager = new Pager<T>();
                pager.setEntityList(list);
                pager.setTotalCounts(totalCounts);
                return pager;
            }
        });
        return pager;
    }

}

文章來源:http://www.blogjava.net/rongxh7

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved