import java.io.*;
import java.util.*;

/**
 * 通用DAO,用于對(duì)象的持久化、查詢(分頁)
 *
 * @author SunHui
 *
 */
public interface Dao {
 /**
  * 保存(持久化)一個(gè)對(duì)象
  *
  * @param object
  *            要保存的對(duì)象
  */
 public void save(Object object);

 /**
  * 更新一個(gè)對(duì)象
  *
  * @param object
  *            要修改的對(duì)象
  */
 public void update(Object object);

 /**
  * 用語句更新記錄
  *
  * @param queryString
  *            查詢語句
  * @param parameters
  *            參數(shù)
  */
 public void updateByQuery(final String queryString,
   final Object[] parameters);

 /**
  * 刪除一個(gè)對(duì)象
  *
  * @param object
  *            要?jiǎng)h除的對(duì)象
  */
 public void delete(Object object);

 /**
  * 根據(jù)類型和對(duì)象id刪除一個(gè)對(duì)象
  *
  * @param clazz
  *            類型
  * @param id
  *            對(duì)象id
  */
 public void delete(Class clazz, Serializable id);

 /**
  * 根據(jù)類型刪除全部對(duì)象
  *
  * @param clazz
  *            類型
  * @return Integer
  */
 public Integer deleteAll(final Class clazz);

 /**
  * 根據(jù)查詢和參數(shù)刪除全部對(duì)象
  *
  * @param queryString
  *            查詢語句
  * @param parameters
  *            參數(shù)
  * @return Integer
  */
 public Integer deleteByQuery(final String queryString,
   final Object[] parameters);

 /**
  * 獲得某個(gè)類型的全部對(duì)象列表
  *
  * @param clazz
  *            類型
  * @return 對(duì)象集合
  */
 public List findAll(Class clazz);

 /**
  * 根據(jù)類型和對(duì)象id載入一個(gè)對(duì)象
  *
  * @param clazz
  *            類型
  * @param id
  *            對(duì)象id
  * @return 目標(biāo)對(duì)象
  */
 public Object load(Class clazz, Serializable id);

 /**
  * 根據(jù)類型和對(duì)象id從數(shù)據(jù)庫取得一個(gè)對(duì)象
  *
  * @param clazz
  *            類
  * @param id
  *            對(duì)象id
  * @return 目標(biāo)對(duì)象
  */
 public Object get(Class clazz, Serializable id);

 /**
  * 根據(jù)查詢語句和查詢參數(shù)從數(shù)據(jù)庫取得一個(gè)對(duì)象
  *
  * @param queryString
  *            查詢語句
  * @param parameters
  *            參數(shù)
  * @return Object 單個(gè)對(duì)象
  */
 public Object get(final String queryString, final Object[] parameters);

 /**
  * 命名查詢
  *
  * @param queryName
  *            命名查詢語句
  * @return 對(duì)象列表
  */
 public List findByNamedQuery(final String queryName);

 /**
  * 依據(jù)單個(gè)參數(shù)做命名查詢
  *
  * @param query
  *            命名查詢語句
  * @param parameter
  *            單個(gè)查詢參數(shù)
  * @return 對(duì)象列表
  */
 public List findByNamedQuery(final String queryString,
   final Object parameter);

 /**
  * 依據(jù)參數(shù)數(shù)組做命名查詢
  *
  * @param query
  *            命名查詢語句
  * @param parameters
  *            查詢參數(shù)數(shù)組
  * @return 對(duì)象列表
  */
 public List findByNamedQuery(final String queryString,
   final Object[] parameters);

 /**
  * 查詢?nèi)?br />   *
  * @param query
  *            查詢語句
  * @return 對(duì)象列表
  */
 public List find(final String queryString);

 /**
  * 帶參數(shù)查詢?nèi)?br />   *
  * @param queryString
  *            查詢語句
  * @param parameters
  *            查詢參數(shù)
  * @return 對(duì)象列表
  */
 public List find(final String queryString, final Object[] parameters);

 /**
  * 分頁查詢
  *
  * @param queryString
  *            查詢語句
  * @param parameters
  *            參數(shù)
  * @param pageInfo
  *            分頁信息
  * @return List 對(duì)象列表
  */
 public List findPageByQuery(final String queryString,
   final Object[] parameters, final PageInfo pageInfo);

}

以下為Dao的Hibernate3實(shí)現(xiàn)

import java.io.*;
import java.util.*;

import org.hibernate.*;
import org.springframework.orm.hibernate3.*;
import org.springframework.orm.hibernate3.support.*;

/**
 * 通用DAO的Hibernate實(shí)現(xiàn)
 *
 * @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 {
 /**
  * 總頁數(shù)
  */
 private int totalPage = 1;

 /**
  * 前一頁
  */
 private int prePage = 1;

 /**
  * 下一頁
  */
 private int nextPage = 1;

 /**
  * 總記錄數(shù)
  */
 private int totalRec = 0;

 /**
  * 默認(rèn)每頁記錄數(shù)
  */
 private final int defaultPageSize = 10;

 /**
  * 每頁記錄數(shù)
  */
 private int pageSize = defaultPageSize;

 /**
  * 當(dāng)前頁碼
  */
 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;
 }
}