今天闲着没事,根据公司的框架中的程序架构进行了修改增加了泛型实现
其中包括4个基类 BaseDao.java, BaseDAOHibernate.java,BaseManager.java,BaseManagerImpl.java
1. dao接口基类
/** * BaseDAO.java * * */ package com.easou.ad.dao; import java.util.HashMap; import java.util.List; public interface BaseDAO<E> { /** * 根据主键获得实体 * * @param id 实体主键 * @return BaseEntity */ E getEntity(Long id); /** * 获得所有实体 * * @return List */ List<E> getAllEntity(); /** * 保存实体 * * @param entity pojo instance */ void saveEntity(E entity); /** * 根据主键删除实体 * * @param id 实体主键 */ void removeEntity(Long id); public List<E> search(HashMap con ,int page,int rowsPerPage); public List<E> search(HashMap con); }
2. dao实现类
/** * BaseDAOHibernate.java * *Copyright 2007 easou, Inc. All Rights Reserved. */ package com.easou.ad.dao.hibernate; import java.lang.reflect.ParameterizedType; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hibernate.HibernateException; import org.hibernate.Query; import org.hibernate.Session; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import com.easou.framework.util.PageList; import com.easou.ad.dao.BaseDAO; public abstract class BaseDAOHibernate<E> extends HibernateDaoSupport implements BaseDAO<E> { protected final Log log = LogFactory.getLog(this.getClass().getName()); protected Class<E> clazz; public BaseDAOHibernate() { this.clazz =(Class<E>)((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; } /** * 根据主键获得实体 * * @param id 实体主键 * @return 实体对象 */ @SuppressWarnings("unchecked") public final E getEntity(final Long id) { return (E)getHibernateTemplate().get(clazz, id); } /** * 获得所有实体 * * @return List */ @SuppressWarnings("unchecked") public final List<E> getAllEntity() { PageList result = new PageList(); List l = getHibernateTemplate().loadAll(clazz); result.addAll(l); result.setCurrentPage(1); result.setPageCount(1); result.setTotalRowCount(l.size()); return result; } /** * 保存实体 * * @param entity 实体对象 */ public final void saveEntity(final E entity) { getHibernateTemplate().saveOrUpdate(entity); } /** * 根据主键删除实体 * * @param id 实体主键 */ public final void removeEntity(final Long id) { Object o = getEntity(id); if (null != o) { getHibernateTemplate().delete(o); } } /** * 执行批量更新和删除操作的HQL * * @param sql hql语句 * @return PageList */ @SuppressWarnings("unchecked") protected final List<E> executeHQL(final String sql) { Session session = null; List<E> ret = null; try { log.info(sql); session = this.getSession(); if (sql.toUpperCase().startsWith("DELETE") || sql.toUpperCase().startsWith("UPDATE")) { session.createQuery(sql).executeUpdate(); } else { ret = session.createQuery(sql).list(); } } catch (HibernateException e) { log.error("executeHQL() error:" + sql, e); throw convertHibernateAccessException(e); } finally { this.releaseSession(session); } return ret; } /** * 执行分页查询 * * @param selectField HQL语句中,SELECT 的内容(如果设置了此参数值,则sql参数中不可带SELCT语句部分) * @param countField HQL语句中,count 的内容 * @param sql HQL语句 * @param page 第几页 * @param rowsPerPage 每页记录数 * @return PageList */ @SuppressWarnings("unchecked") protected final List<E> pageListQuery(final String selectField, String countField, String sql, int page, int rowsPerPage) { PageList result = new PageList(); Session session = null; try { session = this.getSession(); // 预留count的sql语句 String countSql = sql.substring(sql.toUpperCase().indexOf("FROM")); // 设置返回的列,进行查询 if (null != selectField) { sql = "SELECT " + selectField + sql; } if (page <= 0) { page = 1; // page最小为1 } log.debug("query sql:" + sql); Query q = session.createQuery(sql); if (rowsPerPage > 0) { // rowsPerPage的值是0或-1时,都返回全部结果集 q.setFirstResult(rowsPerPage * (page - 1)); q.setMaxResults(rowsPerPage); } result.addAll(q.list()); // 设置分页查询的列 if (null == countField) { countField = "*"; } int rowsCount = result.size(); if (rowsPerPage > 1 && rowsCount > 0) { // 每页记录数大于1且结果集大于0才计算分页信息,否则当前页记录数就作为总的记录数 // TODO 解决page值过大,可能导致rowsCount为0的问题 countSql = "select count(" + countField + ") " + countSql; // 计算总记录数时,消除 Order by语句,提高性能 int oPos = countSql.toUpperCase().indexOf("ORDER BY"); if (oPos > 0) { countSql = countSql.substring(0, oPos); } rowsCount = ((Integer) session.createQuery(countSql).iterate().next()).intValue(); } if (0 == rowsCount) { page = 0; } if (rowsPerPage < 0) { page = 1; rowsPerPage = rowsCount; } result.setCurrentPage(page); result.setTotalRowCount(rowsCount); result.calcPageCount(rowsPerPage); } catch (HibernateException e) { log.error("pageListQuery() error:" + sql, e); throw convertHibernateAccessException(e); } finally { this.releaseSession(session); } return result; } /** * 执行分页查询 * * @param selectField HQL语句中,SELECT 的内容(如果设置了此参数值,则sql参数中不可带SELCT语句部分) * @param sql HQL语句 * @param page 第几页 * @param rowsPerPage 每页记录数 * @param totalRowCount HQL语句获得的总记录数 * @return PageList */ @SuppressWarnings("unchecked") protected final PageList pageListQuery(final String selectField, String sql, int page, int rowsPerPage, final int totalRowCount) { PageList result = new PageList(); Session session = null; try { session = this.getSession(); // 设置返回的列,进行查询 if (null != selectField) { sql = "SELECT " + selectField + sql; } if (page <= 0) { page = 1; // page最小为1 } Query q = session.createQuery(sql); if (rowsPerPage > 0) { // rowsPerPage的值是0或-1时,都返回全部结果集 q.setFirstResult(rowsPerPage * (page - 1)); q.setMaxResults(rowsPerPage); } result.addAll(q.list()); if (0 == totalRowCount) { page = 0; } if (rowsPerPage < 0) { page = 1; rowsPerPage = totalRowCount; } result.setCurrentPage(page); result.setTotalRowCount(totalRowCount); result.calcPageCount(rowsPerPage); } catch (HibernateException e) { log.error("pageListQuery() error:" + sql, e); throw convertHibernateAccessException(e); } finally { this.releaseSession(session); } return result; } /** * 执行分页查询 * * @param sql HQL语句 * @param page 第几页 * @param rowsPerPage 每页记录数 * @param totalRowCount HQL语句获得的总记录数 * @return PageList */ protected final PageList pageListQuery(final String sql, final int page, final int rowsPerPage, final int totalRowCount) { return pageListQuery(null, sql, page, rowsPerPage, totalRowCount); } /** * 执行分页查询 * * @param sql HQL语句 * @param rowsPerPage 每页记录数 * @param page 第几页 * @return PageList * @throws HibernateException hibernate 异常 */ protected List<E> pageListQuery(final String sql, final int page, final int rowsPerPage) throws HibernateException { return pageListQuery(null, null, sql, page, rowsPerPage); } /** * 执行分页查询 * * @param countField HQL语句中,count 的内容 * @param sql HQL语句 * @param rowsPerPage 每页记录数 * @param page 第几页 * @return PageList * @throws HibernateException hibernate 异常 */ protected List pageListQuery(final String countField, final String sql, final int page, final int rowsPerPage) throws HibernateException { return pageListQuery(null, countField, sql, page, rowsPerPage); } /** * 计算HQL查询的返回记录数 * * @param sql 查询语句 * @param countField count语句操作的字段 * @return 记录数 */ protected int countHQL(String sql, String countField) { int rowsCount = 0; Session session = null; try { session = this.getSession(); if (null == countField) { countField = "*"; } sql = "select count(" + countField + ") " + sql; rowsCount = ((Integer) session.createQuery(sql).iterate().next()) .intValue(); } catch (HibernateException e) { log.error("countHQL() error:" + sql, e); throw convertHibernateAccessException(e); } finally { this.releaseSession(session); } return rowsCount; } /** * 计算HQL查询的返回记录数 * * @param sql 查询语句 * @return 记录数 */ protected int countHQL(String sql) { return countHQL(sql, null); } }
3. 业务逻辑基类接口
/** * BaseManager.java * * Copyright 2007 easou, Inc. All Rights Reserved. */ package com.easou.ad.bl; import java.util.HashMap; import java.util.List; /** * TODO 业务逻辑基类接口 * * Revision History * * */ public interface BaseManager<E> { /** * 根据主键获得实体 * * @param id 主键id * @return BaseEntity */ E get(Long id); /** * 获得所有实体 * * @return List */ List<E> getAll(); /** * 保存实体 * * @param entity pojo instance */ void save(E entity); /** * 根据主键删除实体 * * @param id 实体主键 */ void remove(Long id); /** * 分页搜索 * @param con * @param page * @param rowsPerPage * @return */ public List<E> search(HashMap con ,int page,int rowsPerPage); /** * 搜索 * @param con * @return */ public List<E> search(HashMap con); }
4.业务逻辑实现基类
/** * BaseManagerImpl.java * * Copyright 2007 easou, Inc. All Rights Reserved. */ package com.easou.ad.bl.impl; import java.util.HashMap; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.easou.ad.bl.BaseManager; import com.easou.ad.dao.BaseDAO; /** * 业务逻辑基类 * * Revision History * * */ public class BaseManagerImpl<E,D extends BaseDAO<E>> implements BaseManager <E> { protected final Log log = LogFactory.getLog(getClass().getName()); /** * 数据访问接口 */ protected D dao; /** * @return List 所有实体 */ public final List<E> getAll() { return dao.getAllEntity(); } /** * @param id 实体主键 * @return 实体 */ public final E get(final Long id) { return dao.getEntity(id); } /** * @param id 实体主键 */ public final void remove(final Long id) { dao.removeEntity(id); } public List<E> search(HashMap con, int page, int rowsPerPage) { return ((D)dao).search(con, page, rowsPerPage); } public List<E> search(HashMap con) { return ((D)dao).search(con); } /** * @param entity 实体 */ public final void save(final E entity) { dao.saveEntity(entity); } /** * * @return 获取泛形 */ public final D getDao() { return dao; } /** * * @param dao 泛形 */ public final void setDao(final D dao) { this.dao = dao; } }
接下来只需要实现基类,就包含了基本crud操作