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