此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 =