import java.io.*; import java.util.*; /** * 通用DAO,用于对象的持久化、查询(分页) * * @author SunHui * */ public interface Dao { /** * 保存(持久化)一个对象 * * @param object * 要保存的对象 */ public void save(Object object); /** * 更新一个对象 * * @param object * 要修改的对象 */ public void update(Object object); /** * 用语句更新记录 * * @param queryString * 查询语句 * @param parameters * 参数 */ public void updateByQuery(final String queryString, final Object[] parameters); /** * 删除一个对象 * * @param object * 要删除的对象 */ public void delete(Object object); /** * 根据类型和对象id删除一个对象 * * @param clazz * 类型 * @param id * 对象id */ public void delete(Class clazz, Serializable id); /** * 根据类型删除全部对象 * * @param clazz * 类型 * @return Integer */ public Integer deleteAll(final Class clazz); /** * 根据查询和参数删除全部对象 * * @param queryString * 查询语句 * @param parameters * 参数 * @return Integer */ public Integer deleteByQuery(final String queryString, final Object[] parameters); /** * 获得某个类型的全部对象列表 * * @param clazz * 类型 * @return 对象集合 */ public List findAll(Class clazz); /** * 根据类型和对象id载入一个对象 * * @param clazz * 类型 * @param id * 对象id * @return 目标对象 */ public Object load(Class clazz, Serializable id); /** * 根据类型和对象id从数据库取得一个对象 * * @param clazz * 类 * @param id * 对象id * @return 目标对象 */ public Object get(Class clazz, Serializable id); /** * 根据查询语句和查询参数从数据库取得一个对象 * * @param queryString * 查询语句 * @param parameters * 参数 * @return Object 单个对象 */ public Object get(final String queryString, final Object[] parameters); /** * 命名查询 * * @param queryName * 命名查询语句 * @return 对象列表 */ public List findByNamedQuery(final String queryName); /** * 依据单个参数做命名查询 * * @param query * 命名查询语句 * @param parameter * 单个查询参数 * @return 对象列表 */ public List findByNamedQuery(final String queryString, final Object parameter); /** * 依据参数数组做命名查询 * * @param query * 命名查询语句 * @param parameters * 查询参数数组 * @return 对象列表 */ public List findByNamedQuery(final String queryString, final Object[] parameters); /** * 查询全部 * * @param query * 查询语句 * @return 对象列表 */ public List find(final String queryString); /** * 带参数查询全部 * * @param queryString * 查询语句 * @param parameters * 查询参数 * @return 对象列表 */ public List find(final String queryString, final Object[] parameters); /** * 分页查询 * * @param queryString * 查询语句 * @param parameters * 参数 * @param pageInfo * 分页信息 * @return List 对象列表 */ public List findPageByQuery(final String queryString, final Object[] parameters, final PageInfo pageInfo); } 以下为Dao的Hibernate3实现 import java.io.*; import java.util.*; import org.hibernate.*; import org.springframework.orm.hibernate3.*; import org.springframework.orm.hibernate3.support.*; /** * 通用DAO的Hibernate实现 * * @author SunHui * */ public class DaoImpl extends HibernateDaoSupport implements Dao { public void save(Object object) { getHibernateTemplate().save(object); } public void update(Object object) { getHibernateTemplate().update(object); } public void updateByQuery(final String queryString, final Object[] parameters) { getHibernateTemplate().execute(new HibernateCallback() { public Object doInHibernate(Session session) { Query query = session.createQuery(queryString); if (parameters != null) { for (int i = 0; i < parameters.length; i++) { query.setParameter(i, parameters[i]); } } query.executeUpdate(); return null; } }); } public void delete(Object object) { getHibernateTemplate().delete(object); } public void delete(Class clazz, Serializable id) { getHibernateTemplate().delete(load(clazz, id)); } public Integer deleteAll(final Class clazz) { return (Integer) getHibernateTemplate().execute( new HibernateCallback() { public Object doInHibernate(Session session) { Query query = session.createQuery("delete " + clazz.getName()); return new Integer(query.executeUpdate()); } }); } public List findAll(Class clazz) { return getHibernateTemplate().find("from " + clazz.getName()); } public Object load(Class clazz, Serializable id) { return getHibernateTemplate().load(clazz, id); } public Object get(Class clazz, Serializable id) { return getHibernateTemplate().get(clazz, id); } public List findByNamedQuery(final String queryName) { return getHibernateTemplate().findByNamedQuery(queryName); } public List findByNamedQuery(final String queryName, final Object parameter) { return getHibernateTemplate().findByNamedQuery(queryName, parameter); } public List findByNamedQuery(final String queryName, final Object[] parameters) { return getHibernateTemplate().findByNamedQuery(queryName, parameters); } public List find(final String queryString) { return getHibernateTemplate().find(queryString); } public List find(final String queryString, final Object[] parameters) { return getHibernateTemplate().find(queryString, parameters); } public List findPageByQuery(final String queryString, final Object[] parameters, final PageInfo pageInfo) { return (List) getHibernateTemplate().execute(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException { Query query = session.createQuery(queryString); if (parameters != null) { for (int i = 0; i < parameters.length; i++) { query.setParameter(i, parameters[i]); } } ScrollableResults sr = query.scroll(); sr.last(); int totalCount = sr.getRowNumber(); int startIndex = (pageInfo.getPageIndex() - 1) * pageInfo.getPageSize(); query.setMaxResults(pageInfo.getPageSize()); query.setFirstResult(startIndex); int totalRec = totalCount + 1; pageInfo.setTotalRec(totalRec); int totalPage = (totalRec % pageInfo.getPageSize() == 0) ? (totalRec / pageInfo.getPageSize()) : (totalRec / pageInfo.getPageSize()) + 1; int[] pageNumbers = new int[totalPage]; for (int i = 0; i < totalPage; i++) { pageNumbers[i] = (i + 1); } pageInfo.setPageNumbers(pageNumbers); pageInfo.setTotalPage(totalPage); pageInfo.setPageSize(pageInfo.getPageSize()); pageInfo.setPageIndex(pageInfo.getPageIndex()); pageInfo.setPrePage(pageInfo.getPageIndex() - 1); pageInfo.setNextPage(pageInfo.getPageIndex() + 1); return query.list(); } }, true); } public Integer deleteByQuery(final String queryString, final Object[] parameters) { return (Integer) getHibernateTemplate().execute( new HibernateCallback() { public Object doInHibernate(Session session) { Query query = session.createQuery(queryString); if (parameters != null) { for (int i = 0; i < parameters.length; i++) { query.setParameter(i, parameters[i]); } } return new Integer(query.executeUpdate()); } }); } public Object get(final String queryString, final Object[] parameters) { List list = getHibernateTemplate().find(queryString, parameters); if (list != null && !list.isEmpty()) { return list.get(0); } return null; } } /** * 通用分页信息类,用于承载分页信息 * * @author SunHui * */ public class PageInfo { /** * 总页数 */ private int totalPage = 1; /** * 前一页 */ private int prePage = 1; /** * 下一页 */ private int nextPage = 1; /** * 总记录数 */ private int totalRec = 0; /** * 默认每页记录数 */ private final int defaultPageSize = 10; /** * 每页记录数 */ private int pageSize = defaultPageSize; /** * 当前页码 */ private int pageIndex = 1; /** * 全部页码,从1开始 */ private int[] pageNumbers; public int getPageIndex() { return pageIndex; } public void setPageIndex(int pageIndex) { this.pageIndex = pageIndex > 0 ? pageIndex : 1; } public int getNextPage() { return nextPage; } public void setNextPage(int nextPage) { this.nextPage = nextPage > this.totalPage ? this.totalPage : nextPage; } public int getPageSize() { return pageSize; } public void setPageSize(int pageSize) { this.pageSize = pageSize > 0 ? pageSize : 10; } public int getPrePage() { return prePage; } public void setPrePage(int prePage) { this.prePage = prePage < 1 ? 1 : prePage; } public int getTotalPage() { return totalPage; } public void setTotalPage(int totalPage) { this.totalPage = totalPage > 0 ? totalPage : 1; } public int getTotalRec() { return totalRec; } public void setTotalRec(int totalRec) { this.totalRec = totalRec > -1 ? totalRec : 0; } public int[] getPageNumbers() { return pageNumbers; } public void setPageNumbers(int[] pageNumbers) { this.pageNumbers = pageNumbers; } }