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