package com.lyis.dao; import java.io.Serializable; import java.sql.SQLException; import java.text.MessageFormat; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.hibernate.HibernateException; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.metadata.ClassMetadata; import org.springframework.orm.hibernate3.HibernateCallback; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import com.lyis.commons.util.GenericsUtils; import com.lyis.commons.util.StringUtils; import com.lyis.page.Page; /** * 数据处理基类 * * @author Johnson * @version Monday October 25th, 2010 */ public abstract class BaseDao<T extends Serializable> extends HibernateDaoSupport { /** * 当前所管理的实体对象 */ protected Class<T> entityClass; /** * 构造方法,将泛型T.class赋给entityClass */ @SuppressWarnings("unchecked") public BaseDao() { entityClass = GenericsUtils.getSuperClassGenericType(getClass()); } /** * 获取当前所管理的实体对象 * * @return */ public Class<T> getEntityClass() { return this.entityClass; } /** * 查询单个实体对象 * * @param id * 对象的主键值 * @return * @throws Exception */ @SuppressWarnings("unchecked") public T get(Serializable id) throws Exception { return (T) getHibernateTemplate().get(entityClass, id); } /** * 查询多个实体对象 * * @param ids * 对象主键值数组 * @return * @throws Exception */ public List<T> get(Serializable[] ids) throws Exception { StringBuffer hql = new StringBuffer(); hql.append("from ").append(entityClass.getSimpleName()).append( " where ").append(getPKName(entityClass)).append(" in {0}"); if (StringUtils.isEmpty(ids)) { return new ArrayList<T>(); } StringBuffer buf = new StringBuffer(); for (int i = 0; i < ids.length; i++) { buf.append("?,"); } String formtHql = MessageFormat.format(hql.toString(), StringUtils .substr(buf)); return find(formtHql, (Object[]) ids); } /** * 查询单个实体对象 * * @param hql * HQL语句 * @param values * 可变参数列表 * @return * @throws Exception */ public T get(String hql, Object... values) throws Exception { List<T> list = find(hql, values); if (!StringUtils.isEmpty(list)) { return list.get(0); } return null; } /** * 查询单个实体对象 * * @param hql * HQL语句 * @return * @throws Exception */ public T get(String hql) throws Exception { return get(hql, new Object[0]); } /** * 查询唯一结果 * * @param hql * HQL查询语句 * @param values * 可变参数列表 * @return * @throws Exception */ @SuppressWarnings("unchecked") public Object findObject(String hql, Object... values) throws Exception { List list = getHibernateTemplate().find(hql, values); if (!StringUtils.isEmpty(list)) { return list.get(0); } return null; } /** * 获取记录数 * * @param hql * HQL查询语句 * @param values * 可变参数列表 * @return * @throws Exception */ public Integer getCount(String hql, Object... values) throws Exception { Object value = getHibernateTemplate().find(hql, values).listIterator() .next(); return new Integer(value.toString()); } /** * 获取记录数 * * @param hql * HQL查询语句 * @return * @throws Exception */ public Integer getCount(String hql) throws Exception { return getCount(hql, new Object[0]); } /** * 获取记录数 * * @param entityClass * 实体对象 * @return * @throws Exception */ public Integer getCount(Class<T> entityClass) throws Exception { String hql = "select count(t) from " + entityClass.getSimpleName() + " t"; return getCount(hql, new Object[0]); } /** * 根据HQL查询,并返回<b>实体对象</b>集合 * * @param hql * HQL查询语句 * @param values * 可变参数列表 * @return * @throws Exception */ @SuppressWarnings("unchecked") public List<T> find(String hql, Object... values) throws Exception { return getHibernateTemplate().find(hql, values); } /** * 根据HQL查询,并返回<b>实体对象</b>集合 * * @param hql * HQL查询语句 * @return * @throws Exception */ public List<T> find(String hql) throws Exception { return find(hql, new Object[0]); } /** * 根据HQL查询,并返回集合 * * @param hql * HQL查询语句 * @param values * 可变参数列表 * @return * @throws Exception */ @SuppressWarnings("unchecked") public List findList(String hql, Object... values) throws Exception { return getHibernateTemplate().find(hql, values); } /** * 根据HQL查询,并返回集合 * * @param hql * HQL查询语句 * @return * @throws Exception */ @SuppressWarnings("unchecked") public List findList(String hql) throws Exception { return findList(hql, new Object[0]); } /** * 获取所有对象集合 * * @return * @throws Exception */ public List<T> findAll() throws Exception { String hql = "from " + entityClass.getSimpleName() + " t"; return find(hql); } /** * 保存对象 * * @param entity * @throws Exception */ public void save(T entity) throws Exception { getHibernateTemplate().save(entity); } /** * 保存集合中所有的对象 * * @param entities * 实体对象集合 * @throws Exception */ public void save(Collection<T> entities) throws Exception { for (T entity : entities) { save(entity); } } /** * 保存或更新对象 * * @param entity * 实体对象 * @throws Exception */ public void saveOrUpdate(T entity) throws Exception { getHibernateTemplate().saveOrUpdate(entity); } /** * 更新对象 * * @param entity * 实体对象 * @throws Exception */ public void update(T entity) throws Exception { getHibernateTemplate().update(entity); } /** * 批量更新 * * @param hql * HQL语句 * @param values * 可变参数列表 * @throws Exception */ public void update(String hql, Object... values) throws Exception { getHibernateTemplate().bulkUpdate(hql, values); } /** * 批量更新 * * @param hql * HQL语句 * @throws Exception */ public void update(String hql) throws Exception { update(hql, new Object[0]); } /** * 删除对象 * * @param entity * 实体对象 * @throws Exception */ public void delete(T entity) throws Exception { getHibernateTemplate().delete(entity); } /** * 根据主键删除对象 * * @param id * 主键 * @throws Exception */ public void del(Serializable id) throws Exception { T entity = get(id); delete(entity); } /** * 根据指定HQL删除数据 * * @param hql * HQL语句 * @param values * 可变参数列表 * @throws Exception */ public void delete(String hql, Object... values) throws Exception { getHibernateTemplate().bulkUpdate(hql, values); } /** * 根据指定HQL删除数据 * * @param hql * HQL语句 * @throws Exception */ public void delete(String hql) throws Exception { delete(hql, new Object[0]); } /** * 删除集合中所有实体对象 * * @param entities * 实体对象集合 * @throws Exception */ public void deleteAll(Collection<T> entities) throws Exception { getHibernateTemplate().deleteAll(entities); } /** * 创建Query对象 * * @param sess * 会话连接 * @param hql * HQL语句 * @param values * 可变参数列表 * @return */ protected Query createQuery(Session sess, String hql, Object... values) { Query query = sess.createQuery(hql); if (values != null) { for (int i = 0; i < values.length; i++) { query.setParameter(i, values[i]); } } return query; } /** * 获取对象的主键名称 * * @param clazz * 实体类 * @return */ @SuppressWarnings("unchecked") public String getPKName(Class clazz) { ClassMetadata meta = getSessionFactory().getClassMetadata(clazz); String idName = meta.getIdentifierPropertyName(); return idName; } /** * 消除与Session之间的关联 * * @param entity * 实体对象 * @throws Exception */ public void evit(T entity) throws Exception { getSession().evict(entity); } /** * 分页查询(HQL) * * @param resultHql * 查询结果集的HQL * @param countHql * 统计结果集数量的HQL * @param pageNo * 当前页,从1开始 * @param pageSize * 每页显示的记录数 * @param values * 可变参数列表 * @return * @throws Exception */ @SuppressWarnings("unchecked") public Page pagedQuery(final String resultHql, String countHql, int pageNo, final int pageSize, final Object... values) throws Exception { List listCount = find(countHql, values); int totalCount = 0; if (!StringUtils.isEmpty(listCount)) { totalCount = new Integer(listCount.get(0).toString()); } if (totalCount < 1) { return new Page(); } int start = Page.getStartOfPage(pageNo, pageSize); Session sess = getSession(); try { Query query = createQuery(sess, resultHql, values); List list = query.setFirstResult(start).setMaxResults(pageSize) .list(); return new Page(start, totalCount, pageSize, list); } finally { releaseSession(sess); } } /** * 分页查询(HQL) * * @param hql * 查询结果集的HQL * @param pageNo * 当前页,从1开始 * @param pageSize * 每页显示的记录数 * @param values * 可变参数列表 * @return * @throws Exception */ public Page pagedQuery(String hql, int pageNo, int pageSize, Object... values) throws Exception { String countHql = "select count(" + getQueryObject(hql) + ") "; countHql += removeSelect(removeOrders(hql)); countHql = countHql.replace("fetch", ""); return pagedQuery(hql, countHql, pageNo, pageSize, values); } /** * 获取查询对象 * * @param hql * HQL语句 * @return */ private String getQueryObject(String hql) { if (hql.indexOf("distinct") >= 0) { int start = hql.indexOf("distinct"); int end = hql.indexOf("from"); return hql.substring(start, end); } else { return "*"; } } /** * 去除HQL的select子句,未考虑union情况,用于分页查询 * * @param hql * HQL查询 * @return */ private String removeSelect(String hql) { int beginIndex = hql.toLowerCase().indexOf("from"); return hql.substring(beginIndex); } /** * 去除HQL中order by 子句,用于分页查询 * * @param hql * @return */ private String removeOrders(String hql) { String regex = "order//s*by[//w|//W|//s|//S]*"; Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE); Matcher matcher = pattern.matcher(hql); StringBuffer buf = new StringBuffer(); while (matcher.find()) { matcher.appendReplacement(buf, ""); } matcher.appendTail(buf); return buf.toString(); } /** *************************************************************************** */ /** 以下为SQL方式查询 * */ /** *************************************************************************** */ /** * 根据SQL语句查询并返回<b>实体对象</b>集合 * * @param sql * SQL查询语句 * @param values * 可变参数列表 * @return * @throws Exception */ @SuppressWarnings("unchecked") public List<T> findBySql(final String sql, final Object... values) throws Exception { return (List<T>) getHibernateTemplate().execute( new HibernateCallback() { public Object doInHibernate(Session sess) throws HibernateException, SQLException { try { Query query = createSQLQuery(sess, sql, values); query.setEntity(0, entityClass); return query.list(); } finally { releaseSession(sess); } } }); } /** * 根据SQL语句查询并返回<b>实体对象</b>集合 * * @param sql * SQL查询语句 * @return * @throws Exception */ public List<T> findBySql(final String sql) throws Exception { return findBySql(sql, new Object[0]); } /** * 根据SQL语句查询,并返回集合 * * @param sql * SQL查询语句 * @param values * 可变参数列表 * @return * @throws Exception */ @SuppressWarnings("unchecked") public List findListBySql(final String sql, final Object... values) throws Exception { return (List) getHibernateTemplate().execute(new HibernateCallback() { public Object doInHibernate(Session sess) throws HibernateException, SQLException { try { Query query = createSQLQuery(sess, sql, values); return query.list(); } finally { releaseSession(sess); } } }); } /** * 根据SQL语句查询,并返回集合 * * @param sql * SQL查询语句 * @return * @throws Exception */ @SuppressWarnings("unchecked") public List findListBySql(final String sql) throws Exception { return findListBySql(sql, new Object[0]); } /** * 分页查询(SQL) * * @param resultSql * 查询结果集的SQL * @param countSql * 统计结果集数量的SQL * @param pageNo * 当前页,从1开始 * @param pageSize * 每页显示的记录数 * @param values * 可变参数列表 * @return * @throws Exception */ @SuppressWarnings("unchecked") public Page pagedSQLQuery(String resultSql, String countSql, int pageNo, int pageSize, Object... values) throws Exception { List listCount = findListBySql(countSql, values); int totalCount = 0; if (!StringUtils.isEmpty(listCount)) { totalCount = new Integer(listCount.get(0).toString()); } if (totalCount < 1) { return new Page(); } Session sess = getSession(); try { int start = Page.getStartOfPage(pageNo, pageSize); Query query = createSQLQuery(sess, resultSql, values); List list = query.setFirstResult(start).setMaxResults(pageSize) .list(); return new Page(start, totalCount, pageSize, list); } finally { releaseSession(sess); } } /** * 分页查询(SQL) * * @param sql * 查询结果集的SQL * @param pageNo * 当前页,从1开始 * @param pageSize * 每页显示的记录数 * @param values * 可变参数列表 * @return * @throws Exception */ public Page pagedSQLQuery(String sql, int pageNo, int pageSize, Object... values) throws Exception { String countSql = "select count(*) from (" + sql; countSql += ") pagedSQLQuery"; return pagedSQLQuery(sql, countSql, pageNo, pageSize, values); } /** * 创建SQLQuery对象 * * @param sess * 会话连接 * @param sql * SQL语句 * @param values * 可变参数列表 * @return */ protected Query createSQLQuery(Session sess, String sql, Object... values) { Query query = sess.createSQLQuery(sql); if (values != null) { for (int i = 0; i < values.length; i++) { query.setParameter(i, values[i]); } } return query; } } package com.lyis.commons.util; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import org.apache.log4j.Logger; /** * 泛型工具类 * * @author Johnson * @version Tuesday October 26th, 2010 */ public class GenericsUtils { private static Logger log = Logger.getLogger(GenericsUtils.class); /** * 通过反射获得定义Class时声明的父类的范型参数的类型 * * @param clazz * @return */ @SuppressWarnings("unchecked") public static Class getSuperClassGenericType(Class clazz) { return GenericsUtils.getSuperClassGenericType(clazz, 0); } /** * 通过反射获得定义Class时声明的父类的范型参数的类型 * * @param clazz * @param index * @return */ @SuppressWarnings("unchecked") public static Class getSuperClassGenericType(Class clazz, int index) { Type genType = clazz.getGenericSuperclass(); if (!(genType instanceof ParameterizedType)) { log.info(clazz.getSimpleName() + "'s superclass not ParameterizedType"); return Object.class; } Type[] params = ((ParameterizedType) genType).getActualTypeArguments(); if (index >= params.length || index < 0) { log.info("Index: " + index + ", Size of " + clazz.getSimpleName() + "'s Parameterized Type: " + params.length); return Object.class; } if (!(params[index] instanceof Class)) { log.info(clazz.getSimpleName() + " not set the actual class on superclass generic parameter"); return Object.class; } return (Class) params[index]; } }