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

/** *//**
* Copyright 2009-1012 the original author or authors.
* My Blog site: http://www.tkk7.com/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層接口的實(shí)現(xiàn)類
* 許多人習(xí)慣根據(jù)不多的業(yè)務(wù)邏輯定義不同的DAO層接口,如UserDao,NewsDao,CompanyDao等等,
* 這樣往往使得編碼量十分龐大,而且?guī)砹司S護(hù)的困難,因此,抽取此DAO層接口,收錄大部分
* DAO層必須的方法,以供Service層調(diào)用。
* @author rongxinhua
* @version 1.0
* @param <T> 范型,指實(shí)體類
* @param <PK> 范型,指實(shí)體類主鍵的數(shù)據(jù)類型,如Integer,Long
* @see rong.common.dao.EntityDao
*/

@Repository(value="entityDao")

public class EntityDaoImpl<T,PK extends Serializable> extends MyHibernateDaoSupport implements EntityDao<T, PK>
{


/** *//**
* 保存實(shí)體
* 包括添加和修改
* @param t 實(shí)體對(duì)象
*/

public void saveOrUpdate(T t)
{
getHibernateTemplate().saveOrUpdate(t);
}

/** *//**
* 更新實(shí)體
* 可用于添加、修改、刪除操作
* @param hql 更新的HQL語句
* @param params 參數(shù),可有項(xiàng)目或多項(xiàng)目,代替Hql中的"?"號(hào)
*/

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;
}
});
}

/** *//**
* 刪除實(shí)體
* @param t 實(shí)體對(duì)象
*/

public void delete(T t)
{
getHibernateTemplate().delete(t);
}

/** *//**
* 刪除實(shí)體
* @param entityClass 實(shí)體類名
* @param id 實(shí)體的ID
*/

public void delete(Class<T> entityClass,PK id)
{
getHibernateTemplate().delete(get(entityClass,id));
}

/** *//**
* 單查實(shí)體
* @param entityClass 實(shí)體類名
* @param id 實(shí)體的ID
* @return 實(shí)體對(duì)象
*/
@SuppressWarnings("unchecked")

public T get(Class<T> entityClass,PK id)
{
return (T)getHibernateTemplate().get(entityClass, id);
}

/** *//**
* 查詢?nèi)坑涗浟斜?br />
* @param entityClass 實(shí)體類名
* @param propertyName 排序的參照屬性
* @param isAsc 排序方式
* @param criterions 查詢條件,可為0項(xiàng)或任意多項(xiàng)目
* @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; //設(shè)置為0,則表示查詢?nèi)坑涗?/span>
return findByCriteria(entityClass, propertyName, isAsc, firstResult, maxResults, criterions);
}

/** *//**
* 查詢列表
* @param entityClass 實(shí)體類名
* @param propertyName 排序的參照屬性
* @param isAsc 排序方式,true表示升序,false表示降序,當(dāng)propertyName賦值為null時(shí),此參數(shù)無效
* @param firstResult 開始記錄序號(hào)
* @param maxResults 最大記錄數(shù)
* @param criterions 查詢條件,可有0項(xiàng)或任意多項(xiàng)目
* @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);
}
//按某個(gè)屬性排序

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;
}

/** *//**
* 查詢總記錄數(shù)
* @param entityClass 實(shí)體類名
* @param criterions 查詢條件,可有0項(xiàng)或任意多項(xiàng)
* @return 總記錄數(shù)
*/

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 實(shí)體類名
* @param propertyName 排序參照屬性
* @param isAsc 排序方式,true表示升序,false表示降序,當(dāng)propertyName賦值為null時(shí),此參數(shù)無效
* @param firstResult 開始記錄序號(hào)
* @param maxResults 最大記錄數(shù)
* @param criterions 查詢條件,可為0項(xiàng)或任意多項(xiàng)目
* @return 封裝List和totalCounts的Pager對(duì)象
*/
@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;
}

/** *//**
* 根據(jù)屬性值查詢列表
* @param entityClass 實(shí)體類名
* @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;
}

/** *//**
* 根據(jù)屬性值查詢單個(gè)對(duì)象
* @param entityClass 實(shí)體類名
* @param propertyName 屬性名
* @param value 屬性值
* @return 實(shí)體對(duì)象
*/
@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;
}

/** *//**
* 根據(jù)屬性值查詢實(shí)體是否存在
* @param entityClass 實(shí)體類名
* @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 查詢語句
* 用法如:可用于登錄驗(yàn)證時(shí),根據(jù)用戶名、密碼等信息查詢用戶
* @param params 參數(shù)數(shù)組,代替HQL中的"?"號(hào),可有0項(xiàng)目或多項(xiàng)
* @return 唯一實(shí)體,返回null則表示不存在配置的實(shí)體
* @exception 如果查詢的結(jié)果集不唯一,則拋異常
*/
@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 參數(shù)數(shù)組,代替hql中的"?"號(hào)
* @return 結(jié)果集List
*/
@SuppressWarnings("unchecked")

public List<T> findByHql(String hql,Object
params)
{
List list = getHibernateTemplate().find(hql, params);
return list;
}

/** *//**
* 按HQL分頁查詢
* @param firstResult 開始記錄號(hào)
* @param maxResults 最大記錄數(shù)
* @param hql 查詢語句,支持連接查詢和多條件查詢
* @param params 參數(shù)數(shù)組,代替餐hql中的"?"號(hào)
* @return 封裝List和total的Pager對(duì)象
*/
@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(); //總記錄數(shù)
//用于分頁查詢

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;
}

}

相關(guān)說明:MyHibernateDaoSupport類是我自定義的類,該類繼承HibernateDaoSupport,相關(guān)代碼,請(qǐng)參考我的
基于Annotation的Struts2.0+Hibernate3.3+Spring2.5整合開發(fā) (2) ,EntityDao接口與實(shí)現(xiàn)類EntityDao的方法聲明一樣,在此暫且不貼出來.而代碼中用到的Pager類,是一個(gè)封裝list<Entity>和totalCounts的POJO類,代碼比較簡單,在此也不貼出來.
開發(fā)本代碼之前,參考過以下資料:
1)Springside的源碼
2)一位北京網(wǎng)友發(fā)給我的項(xiàng)目中的代碼
(*^-^*) 本文原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處, http://www.tkk7.com/rongxh7謝謝! (*^-^*)
本文原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處,謝謝!http://www.tkk7.com/rongxh7(心夢(mèng)帆影JavaEE技術(shù)博客)
posted on 2009-05-19 09:56
心夢(mèng)帆影 閱讀(10458)
評(píng)論(20) 編輯 收藏 所屬分類:
Hibernate 、
Spring