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