Hibernate实现通用DAO

package com.myerp.dao;

import java.io.Serializable;
import java.util.LinkedHashMap;
import java.util.List;

import javax.annotation.Resource;

import org.hibernate.Query;
import org.hibernate.SessionFactory;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.myerp.dto.QueryResult;

public abstract class SimpleDaoSupport<T> extends HibernateDaoSupport {

	private Class<T> entityClass;
	
	protected SimpleDaoSupport(Class<T> entityClass) {
		this.entityClass = entityClass;
	}
	
	/**
	 * 将sessionFactory注入Spring的模板
	 */
	@Resource(name="sessionFactory")
	protected void setSF(SessionFactory sf) {
		setSessionFactory(sf);
	}
	
	public void save(T transientInstance) {
		getHibernateTemplate().save(transientInstance);
	}

	public void delete(T persistentInstance) {
		getHibernateTemplate().delete(persistentInstance);
	}
	
	public void delete(Serializable id) {
		getSession().delete(load(id));
		
	}

	public void update(T persistentInstance) {
		getHibernateTemplate().update(persistentInstance);
	}
	
	public void merge(T persistentInstance) {
		getHibernateTemplate().merge(persistentInstance);
	}
	
	public T findById(Serializable id) {
		return (T) getHibernateTemplate().get(entityClass.getName(), id);
	}
	public T load(Serializable id) {
		return (T) getSession().load(entityClass, id);
	}

	public List<T> findByExample(T instance) {
		return getHibernateTemplate().findByExample(instance);
	}

	public List<T> findByProperty(String propertyName, Object value) {
		String queryString = "from "+ entityClass.getSimpleName() +" as model where model." + propertyName + "= ?";
		return getHibernateTemplate().find(queryString, value);
	}

	public List<T> findAll() {
		String queryString = "from " + entityClass.getSimpleName();
		return getHibernateTemplate().find(queryString);
	}
	/**
	 * 执行HQL语句
	 */
	public void execute(String hql) {
		getSession().createQuery(hql).executeUpdate();
	}
	/**
	 * 指定过滤条件的分页数据
	 */
	public QueryResult<T> findScrollData(int start, int maxResults, List<String> whereClause){
		return this.findScrollData(start, maxResults, whereClause, null);
	}
	/**
	 * 无任何条件的分页
	 */
	public QueryResult<T> findScrollData(int pageNo, int pageSize){
		return this.findScrollData(pageNo, pageSize, null, null);
	}
	/**
	 * 有排序规则的分页数据
	 */
	public QueryResult<T> findScrollData(int pageNo, int pageSize, LinkedHashMap<String, String> orderbyClause) {
		return this.findScrollData(pageNo, pageSize, null, orderbyClause);
	}
	/**
	 * 分页查询数据
	 * @param start 开始记录
	 * @param end 结束记录
	 * @param whereClause 过滤条件
	 * @param orderbyClause 排序子句
	 * @return 查询结果, 里面包含了指定页的记录和总共的页数
	 */
	public QueryResult<T> findScrollData(int pageNo, int pageSize, List<String> whereClause, LinkedHashMap<String, String> orderbyClause) {
		int start = pageNo > 0 ?(pageNo - 1) * pageSize : 0;
		QueryResult<T> qr = new QueryResult<T>();
		Query q = getSession().createQuery("select count(*) from " + entityClass.getSimpleName() + " entity " + buildWhereClause(whereClause));
		int count = Integer.parseInt(q.uniqueResult() + "");
		if(start >= count) start = count - 1 - pageSize;
		q = getSession().createQuery("from " + entityClass.getSimpleName() + " entity " + buildWhereClause(whereClause) + buildOrderByClause(orderbyClause));
		q.setFirstResult(start).setMaxResults(pageSize);
		qr.setPageNo(pageNo).setPageSize(pageSize).setRecordCount(count).setRecords(q.list());
		return qr;
	}
	
	/**
	 * 建立排序子句
	 */
	protected String buildOrderByClause(LinkedHashMap<String, String> orderbyClause) {
		StringBuilder orderby = new StringBuilder("");
		if(orderbyClause != null && orderbyClause.size() > 0) {
			orderby.append(" order by ");
			for(String prop : orderbyClause.keySet()) {
				orderby.append(" entity.").append(prop).append(" ").append(orderbyClause.get(prop)).append(",");
			}
			orderby.deleteCharAt(orderby.length()-1);
		}
		return orderby.toString();
	}
	
	/**
	 * 根据过滤条件收集器建立where子句
	 */
	protected String buildWhereClause(List<String> whereClause) {
		StringBuilder where = new StringBuilder("");
		if(whereClause != null && whereClause.size() > 0) {
			where.append(" ").append("where ");
			for(String str : whereClause) {
				where.append(" entity.").append(str).append(" and ");
			}
			where.delete(where.lastIndexOf("and"), where.length()-1);
		}
		return where.toString();
	}
}













你可能感兴趣的:(DAO,spring,Hibernate,orm)