现在的位置: 首页 > 综合 > 正文

hibernate 泛型BaseDAO

2018年04月30日 ⁄ 综合 ⁄ 共 11129字 ⁄ 字号 评论关闭

baseDAO接口

package com.dg11185.shgw.DAO.common;

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

import org.hibernate.Session;

import com.dg11185.shgw.utils.PagingParams;
import com.dg11185.shgw.utils.PagingResults;

/**
 * 公共DAO的接口类
 * @author 黄文韬
 * @since 1.0  
 * @Copyright 2013 东莞市邮政局All rights reserved.
 */
public interface BaseDao<T> {
	
	/**
	 * 根据ID查找对象
	 * 
	 * @param entityClass 实体对象类
	 * @param id
	 * @return 实体对象
	 */
	public T findById(Class<T> entityClass,Serializable id);
	
	/**
	 * 根据查找所有对象
	 * 
	 * @param entityClass 实体对象类
	 * @return 实体对象集合
	 */
	public List findAll(Class entityClass);

    /**
     * 获取全部对象
     * 带排序字段与升降序参数
     * @param entityClass 实体对象类
     * @param orderBy 排序字段
     * @param isAsc 升序否?
     * @return 实体对象集合
     */
    public List findAll(Class entityClass, String orderByProperty, boolean isAsc);
    
    /**
     * 根据实例查询(不支持主键,不支持关联,不支持null)
     * 带排序字段与升降序参数
     * @param entityClass 实体对象类
     * @return 实体对象集合
     */
    public List<T> findByExample(Object entity);
    
    /**
     * 自定义查询
     * 
     * @param hql语句
     * @param params 动态参数
     * @return 实体对象集合
     */
    public List find(String hql,Object... params);

    /**
     * 自定义查询
     * 
     * @param hql语句
     * @param entityClass 实体对象类
     * @return 实体对象
     */
	public Object findObj(String hql,Object...params);
    
	/**
	 * 根据属性进行查找
	 * @param entityClass 实体类名
	 * @param 属性名
	 * @param 值
	 * @return 实体对象集合
	 */
    public List findByProperty(Class entityClass,String propertyName,Object value);
    
    /**
     * 分页查询
     * 
  	 * @param   params 分页传入的参数
  	 * @return  分页结果对象
     */
    public PagingResults paging(final PagingParams params) ;
    
    /**
     * 保存对象
     * @param obj 实体对象
     * 
     */
    public void save(Object obj);
    
    /**
     * 保存/更新对象
     * @param entityClass 实体对象类
     * @param obj 实体对象
     * @return 保存/更新后的对象
     */
    public T merge(Class<T> entityClass,Object obj);
    
    /**
     * 更新对象
     * @param obj 实体对象
     */
    public void update(Object obj);
    
    /**
     * 删除对象
     * @param obj 实体对象
     */
    public void delete(Object obj);
    
    /**
     * 删除对象
     * @param entityClass 实体对象类
     * @param id 
     */
    public void deleteById(Class entityClass,Serializable id);
    
    /**
     * 根据ID删除对象数组
     * @param entityClass
     * @param ID字段名字
     * @param ids 以逗号隔开 1,2,3  如果是字符串'hwt001','hwt002'
     */
    public void deleteByIds(Class entityClass, String idName , Serializable[] ids);
    
    /**
     * 批量更新对象
     * @objs 需要更新的对象集合
     */
    public void batchUpdate(final List objs);
    
    /**
     * 批量插入对象
     * @objs 需要更新的对象集合
     */
    public void batchInsert(final List objs);
    
    /**
     * 得到当前session
     * @return session
     */
    public Session getCurrentSession();
    
    /**
     * 刷新缓存
     */
    public void flush();
    
    /**
     * 清除缓存中的对象
     */
    public void clear();
    
}


接口实现类,所有DAO继承此实现类
package com.dg11185.shgw.DAO.common;


import java.io.Serializable;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;


import javax.annotation.Resource;


import org.hibernate.Hibernate;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Order;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;


import com.dg11185.shgw.common.ConfigConstants;
import com.dg11185.shgw.utils.PagingParams;
import com.dg11185.shgw.utils.PagingResults;


/**
 * 公共DAO的基类
 * 
 * @since 1.0
 * @author 黄文韬
 * @Copyright 2013 东莞市邮政局All rights reserved.
 */
public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T> {


	@Override
	protected void initDao() throws Exception {
		// nothing
	}


	/**
	 * 注入sessionFactory
		 * @param sessionFactory
	 */
	@Resource(name = "sessionFactory")
	public void setSuperSessionFactory(SessionFactory sessionFactory) {
		super.setSessionFactory(sessionFactory);
	}


	/**
	 * 根据ID查找对象
		 * @param entityClass
	 *            实体对象类
	 * @param id
	 * @return 实体对象
	 */
	@Override
	public T findById(Class<T> entityClass, Serializable id) {
		return entityClass.cast(super.getHibernateTemplate().get(entityClass,
				id));
	}


	/**
	 * 根据实例查询(不支持主键,不支持关联,不支持null) 带排序字段与升降序参数
		 * @param entityClass
	 *            实体对象类
	 * @return 实体对象集合
	 */
	@SuppressWarnings("unchecked")
	@Override
	public List<T> findByExample(Object entity) {
		return getHibernateTemplate().findByExample(entity);
	}


	/**
	 * 根据查找所有对象
		 * @param entityClass
	 *            实体对象类
	 * @return 实体对象集合
	 */
	@Override
	public List findAll(Class entityClass) {
		String queryString = "from " + entityClass.getSimpleName();
		return super.getHibernateTemplate().find(queryString);
	}


	/**
	 * 获取全部对象 带排序字段与升降序参数
		 * @param entityClass
	 *            实体对象类
	 * @param orderBy
	 *            排序字段
	 * @param isAsc
	 *            升序否?
	 * @return 实体对象集合
	 */
	@Override
	public List findAll(Class entityClass, String orderByProperty, boolean isAsc) {
		return isAsc ? super.getHibernateTemplate().findByCriteria(
				DetachedCriteria.forClass(entityClass).addOrder(
						Order.asc(orderByProperty))) : super
				.getHibernateTemplate().findByCriteria(
						DetachedCriteria.forClass(entityClass).addOrder(
								Order.desc(orderByProperty)));
	}


	/**
	 * 自定义查询
		 * @param entityClass
	 *            实体对象类
	 * @param hql语句
	 * @param params
	 *            动态参数
	 * @return 实体对象集合
	 */
	@SuppressWarnings({ "rawtypes" })
	@Override
	public List find(String hql, Object... params) {
		return getHibernateTemplate().find(hql, params);
	}


	/**
	 * 自定义查询
		 * @param entityClass
	 *            实体对象类
	 * @param hql语句
	 * @return 实体对象集合
	 */
	@SuppressWarnings({ "rawtypes" })
	public Object findObj(String hql, Object... params) {
		List list = getHibernateTemplate().find(hql, params);
		if (list.size() > 0) {
			return list.get(0);
		} else {
			return null;
		}
	}


	/**
	 * 根据属性进行查找
		 * @param entityClass
	 *            实体类名
	 * @param 属性名
	 * @param 值
	 * @return 实体对象集合
	 */
	@SuppressWarnings({ "unchecked", "rawtypes" })
	@Override
	public List findByProperty(Class entityClass, String propertyName,
			Object value) {
		String queryString = "from " + entityClass.getSimpleName()
				+ " as model where model." + propertyName + "= ?";
		return super.getHibernateTemplate().find(queryString, value);
	}


	/**
	 * 分页查询
		 * @param allSizeHql
	 *            查找所有记录条数的hql语句
	 * @param queryListHql
	 *            查找结果集的hql语句
	 * @param page
	 *            需要显示的分页的当前页码
	 * @param size
	 *            每页需要显示多少条记录
	 * @return Map<String,Object> 存入分页所需数据 currentPage == 当前页的页码 pages ==
	 *         查询结果的总页数 allSize == 记录总条数 list == 当前页的结果集
	 */
	/**
	 * 分页查询
		 * @param 分页参数类
	 * @return 分页结果类
	 */
	@SuppressWarnings({ "unchecked", "rawtypes" })
	@Override
	public PagingResults paging(final PagingParams params) {
		return (PagingResults) getHibernateTemplate().execute(
				new HibernateCallback() {
					@Override
					public Object doInHibernate(Session session)
							throws HibernateException, SQLException {
						int currentPage = params.getNextPage();


						Query query = session.createQuery(params
								.getAllSizeHql());
						// 总记录数
						Integer allSize = Integer.parseInt(query.list().get(0)
								.toString());
						// 每页显示的记录数
						int size = params.getPageSize();
						Integer pages = allSize % size == 0 ? allSize / size
								: allSize / size + 1;


						if (currentPage > pages) {
							currentPage = pages;
						} else if (currentPage <= 0) {
							currentPage = 1;
						}


						// 得到分页的list
						Query listQuery = session.createQuery(params
								.getQueryHql());
						listQuery.setFirstResult((currentPage - 1) * size)
								.setMaxResults(size);
						List list = listQuery.list();
						PagingResults results = new PagingResults();
						results.setCurrentPage(currentPage);
						results.setTotalPages(pages);
						results.setTotalSize(allSize);
						results.setList(list);


						return results;
					}
				});
	}


	/**
	 * 分页查询
		 * @param allSizeHql
	 *            查找所有记录条数的hql语句
	 * @param queryListHql
	 *            查找结果集的hql语句
	 * @param page
	 *            需要显示的分页的当前页码
	 * @param size
	 *            每页需要显示多少条记录
	 * @return Map<String,Object> 存入分页所需数据 currentPage == 当前页的页码 pages ==
	 *         查询结果的总页数 allSize == 记录总条数 list == 当前页的结果集
	 */
	/**
	 * 分页查询
		 * @param 分页参数类
	 * @return 分页结果类
	 */
	@SuppressWarnings({ "unchecked", "rawtypes" })
	public PagingResults paging(final PagingParams params,
			final List<String> columns, final List<?> args) {
		return (PagingResults) getHibernateTemplate().execute(
				new HibernateCallback() {
					@Override
					public Object doInHibernate(Session session)
							throws HibernateException, SQLException {
						int currentPage = params.getNextPage();


						Query query = session.createQuery(params
								.getAllSizeHql());
						for (int index = 0; index < columns.size(); index++) {
							query.setParameter(columns.get(index),
									args.get(index));
						}
						// 总记录数
						Integer allSize = Integer.parseInt(query.list().get(0)
								.toString());
						// 每页显示的记录数
						int size = params.getPageSize();
						Integer pages = allSize % size == 0 ? allSize / size
								: allSize / size + 1;


						if (currentPage > pages) {
							currentPage = pages;
						} else if (currentPage <= 0) {
							currentPage = 1;
						}


						// 得到分页的list
						Query listQuery = session.createQuery(params
								.getQueryHql());
						for (int index = 0; index < columns.size(); index++) {
							listQuery.setParameter(columns.get(index),
									args.get(index));
						}
						listQuery.setFirstResult((currentPage - 1) * size)
								.setMaxResults(size);
						List list = listQuery.list();
						PagingResults results = new PagingResults();
						results.setCurrentPage(currentPage);
						results.setTotalPages(pages);
						results.setTotalSize(allSize);
						results.setList(list);


						return results;
					}
				});
	}


	/**
	 * 保存对象
		 * @param obj
	 *            实体对象
		 */
	@Override
	public void save(Object obj) {
		super.getHibernateTemplate().save(obj);
	}


	/**
	 * 保存对象
		 * @param entityClass
	 *            实体对象类
	 * @param obj
	 *            实体对象
	 * @return 保存后的对象
	 */
	@Override
	public T merge(Class<T> entityClass, Object obj) {
		return entityClass.cast(super.getHibernateTemplate().merge(obj));
	}


	/**
	 * 更新对象
		 * @param obj
	 *            实体对象
	 */
	@Override
	public void update(Object obj) {
		super.getHibernateTemplate().update(obj);
	}


	/**
	 * 删除对象
		 * @param obj
	 *            实体对象
	 */
	@Override
	public void delete(Object obj) {
		super.getHibernateTemplate().delete(obj);
	}


	/**
	 * 删除对象
		 * @param entityClass
	 *            实体对象类
	 * @param id
	 */
	@Override
	public void deleteById(Class entityClass, Serializable id) {
		super.getHibernateTemplate().delete(findById(entityClass, id));
	}


	/**
	 * 根据ID删除对象数组
		 * @param entityClass
	 * @param ids
	 *            以逗号隔开 1,2,3 如果是字符串'hwt001','hwt002'
	 */
	@Override
	public void deleteByIds(Class entityClass, String idName, Serializable[] ids) {
		String id = "?";
		for (int i = 0; i < ids.length - 1; i++) {
			id = id + ",?";
		}


		String hql = "delete from " + entityClass.getSimpleName() + " where "
				+ idName + " in (" + id + ")";
		getHibernateTemplate().bulkUpdate(hql, ids);
	}


	/**
	 * 得到当前session
		 * @return session
	 */
	@Override
	public Session getCurrentSession() {
		return super.getHibernateTemplate().getSessionFactory()
				.getCurrentSession();
	}


	/**
	 * 刷新缓存
	 */
	@Override
	public void flush() {
		super.getHibernateTemplate().flush();


	}


	/**
	 * 清除缓存中的对象
	 */
	@Override
	public void clear() {
		super.getHibernateTemplate().clear();
	}


	/**
	 * 获取当前申请单的流水号
		 * @author IRun
	 * @param sheetcode
	 *            表单代码,如01
	 * @param columnname
	 *            列名,对应pojo实体类的字段
	 * @param t
	 *            表名
	 * @return 申请单号
	 */
	public String getApplyNo(String sheetcode, Class<?> t, String columnname) {
		// 日期格式
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
		// 序列名
		String seqName = null;
		// 获取序列名
		if (ConfigConstants.PURFORM_TYPE.equals(sheetcode)) {
			seqName = "SEQ_PURCHASING";
		}
		if (ConfigConstants.INPFORM_TYPE.equals(sheetcode)) {
			seqName = "SEQ_ENTERSTORE";
		}
		if (ConfigConstants.OUTFORM_TYPE.equals(sheetcode)) {
			seqName = "SEQ_STOCKREMOVAL";
		}
		if (ConfigConstants.RTFORM_TYPE.equals(sheetcode)) {
			seqName = "SEQ_RETURNTOCLIENT";
		}
		if (ConfigConstants.ECGFORM_TYPE.equals(sheetcode)) {
			seqName = "SEQ_EXCHANGETOCLIENT";
		}
		if (ConfigConstants.RTSUPGFORM_TYPE.equals(sheetcode)) {
			seqName = "SEQ_RETURNTOSUPPILER";
		}
		if (ConfigConstants.ECSUPGFORM_TYPE.equals(sheetcode)) {
			seqName = "SEQ_EXCHANGETOSUPPLIER";
		}
		// 查询当日最大的申请单流水号
		String sql = "select " + seqName + ".NEXTVAL as id from dual";
		Session session = getCurrentSession();
		Long id = (Long) session.createSQLQuery(sql)
				.addScalar("id", Hibernate.LONG).uniqueResult();


		// 生成申请单号
		String runingNum = id.toString();
		Integer no = Integer.parseInt(runingNum) + 1;
		String noStr = no.toString();
		if (noStr.length() == 1) {
			noStr = "000" + noStr;
		} else if (noStr.length() == 2) {
			noStr = "00" + noStr;
		} else if (noStr.length() == 3) {
			noStr = "0" + noStr;
		}
		return sdf.format(new Date()) + sheetcode + noStr;
	}


	/**
	 * 批量更新
		 * @param objs
	 *            需要更新的对象集合
	 */
	@Override
	public void batchUpdate(final List objs) {
		getHibernateTemplate().execute(new HibernateCallback() {
			@Override
			public Object doInHibernate(Session session)
					throws HibernateException, SQLException {
				int len = objs.size();
				for (int i = 0; i < len; i++) {
					session.merge(objs.get(i));
					if (i % 15 == 0) {
						session.flush();
						session.clear();
					}
				}
				return null;
			}
		});
	}


	/**
	 * 批量插入
		 * @param objs
	 *            需要插入的对象集合
	 */
	@Override
	public void batchInsert(final List objs) {
		getHibernateTemplate().execute(new HibernateCallback() {
			@Override
			public Object doInHibernate(Session session)
					throws HibernateException, SQLException {
				int len = objs.size();
				for (int i = 0; i < len; i++) {
					session.save(objs.get(i));
					if (i % 15 == 0) {
						session.flush();
						session.clear();
					}
				}
				return null;
			}
		});
	}


}

抱歉!评论已关闭.