首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

DAO层公共种(Spring+Hibernate实现)

2012-12-21 
DAO层公共类(Spring+Hibernate实现)package rong.common.daoimport java.io.Serializableimport java.sq

DAO层公共类(Spring+Hibernate实现)

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

热点排行