詳細介紹 Hibernate 泛型 DAO 及其使用方法
阿新 • • 發佈:2019-02-06
package com.th.huz;
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import org.apache.commons.beanutils.PropertyUtils;
import org.hibernate.Criteria;
import org.hibernate.LockMode;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Example;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
/**
* GenericHibernateDao 繼承 HibernateDao,簡單封裝 HibernateTemplate 各項功能,
* 簡化基於Hibernate Dao 的編寫。
*
* @author lny
*/
@SuppressWarnings("unchecked")
publicclass GenericHibernateDao<T extends Serializable, PK extends Serializable>extends HibernateDaoSupport implements GenericDao<T, PK > {
// 實體類型別(由構造方法自動賦值)private Class<T> entityClass;
// 構造方法,根據例項類自動獲取實體類型別public GenericHibernateDao() {
this.entityClass =null;
Class c = getClass();
Type t = c.getGenericSuperclass();
if (t instanceof ParameterizedType) {
Type[] p = ((ParameterizedType) t).getActualTypeArguments();
this.entityClass = (Class<T>) p[0];
}
}
// -------------------- 基本檢索、增加、修改、刪除操作 --------------------
// 根據主鍵獲取實體。如果沒有相應的實體,返回 null。public T get(PK id) {
return (T) getHibernateTemplate().get(entityClass, id);
}
// 根據主鍵獲取實體並加鎖。如果沒有相應的實體,返回 null。public T getWithLock(PK id, LockMode lock) {
T t = (T) getHibernateTemplate().get(entityClass, id, lock);
if (t !=null) {
this.flush(); // 立即重新整理,否則鎖不會生效。 }
return t;
}
// 根據主鍵獲取實體。如果沒有相應的實體,丟擲異常。public T load(PK id) {
return (T) getHibernateTemplate().load(entityClass, id);
}
// 根據主鍵獲取實體並加鎖。如果沒有相應的實體,丟擲異常。public T loadWithLock(PK id, LockMode lock) {
T t = (T) getHibernateTemplate().load(entityClass, id, lock);
if (t !=null) {
this.flush(); // 立即重新整理,否則鎖不會生效。 }
return t;
}
// 獲取全部實體。public List<T> loadAll() {
return (List<T>) getHibernateTemplate().loadAll(entityClass);
}
// loadAllWithLock() ?
// 更新實體publicvoid update(T entity) {
getHibernateTemplate().update(entity);
}
// 更新實體並加鎖publicvoid updateWithLock(T entity, LockMode lock) {
getHibernateTemplate().update(entity, lock);
this.flush(); // 立即重新整理,否則鎖不會生效。 }
// 儲存實體到資料庫publicvoid save(T entity) {
getHibernateTemplate().save(entity);
}
// saveWithLock()?
// 增加或更新實體publicvoid saveOrUpdate(T entity) {
getHibernateTemplate().saveOrUpdate(entity);
}
// 增加或更新集合中的全部實體publicvoid saveOrUpdateAll(Collection<T> entities) {
getHibernateTemplate().saveOrUpdateAll(entities);
}
// 刪除指定的實體publicvoid delete(T entity) {
getHibernateTemplate().delete(entity);
}
// 加鎖並刪除指定的實體publicvoid deleteWithLock(T entity, LockMode lock) {
getHibernateTemplate().delete(entity, lock);
this.flush(); // 立即重新整理,否則鎖不會生效。 }
// 根據主鍵刪除指定實體publicvoid deleteByKey(PK id) {
this.delete(this.load(id));
}
// 根據主鍵加鎖並刪除指定的實體publicvoid deleteByKeyWithLock(PK id, LockMode lock) {
this.deleteWithLock(this.load(id), lock);
}
// 刪除集合中的全部實體publicvoid deleteAll(Collection<T> entities) {
getHibernateTemplate().deleteAll(entities);
}
// -------------------- HSQL ----------------------------------------------
// 使用HSQL語句直接增加、更新、刪除實體publicint bulkUpdate(String queryString) {
return getHibernateTemplate().bulkUpdate(queryString);
}
// 使用帶引數的HSQL語句增加、更新、刪除實體publicint bulkUpdate(String queryString, Object[] values) {
return getHibernateTemplate().bulkUpdate(queryString, values);
}
// 使用HSQL語句檢索資料public List find(String queryString) {
return getHibernateTemplate().find(queryString);
}
// 使用帶引數的HSQL語句檢索資料public List find(String queryString, Object[] values) {
return getHibernateTemplate().find(queryString, values);
}
// 使用帶命名的引數的HSQL語句檢索資料public List findByNamedParam(String queryString, String[] paramNames,
Object[] values) {
return getHibernateTemplate().findByNamedParam(queryString, paramNames,
values);
}
// 使用命名的HSQL語句檢索資料public List findByNamedQuery(String queryName) {
return getHibernateTemplate().findByNamedQuery(queryName);
}
// 使用帶引數的命名HSQL語句檢索資料public List findByNamedQuery(String queryName, Object[] values) {
return getHibernateTemplate().findByNamedQuery(queryName, values);
}
// 使用帶命名引數的命名HSQL語句檢索資料public List findByNamedQueryAndNamedParam(String queryName,
String[] paramNames, Object[] values) {
return getHibernateTemplate().findByNamedQueryAndNamedParam(queryName,
paramNames, values);
}
// 使用HSQL語句檢索資料,返回 Iteratorpublic Iterator iterate(String queryString) {
return getHibernateTemplate().iterate(queryString);
}
// 使用帶引數HSQL語句檢索資料,返回 Iteratorpublic Iterator iterate(String queryString, Object[] values) {
return getHibernateTemplate().iterate(queryString, values);
}
// 關閉檢索返回的 Iteratorpublicvoid closeIterator(Iterator it) {
getHibernateTemplate().closeIterator(it);
}
// -------------------------------- Criteria ------------------------------
// 建立與會話無關的檢索標準public DetachedCriteria createDetachedCriteria() {
return DetachedCriteria.forClass(this.entityClass);
}
// 建立與會話繫結的檢索標準public Criteria createCriteria() {
returnthis.createDetachedCriteria().getExecutableCriteria(
this.getSession());
}
// 檢索滿足標準的資料public List findByCriteria(DetachedCriteria criteria) {
return getHibernateTemplate().findByCriteria(criteria);
}
// 檢索滿足標準的資料,返回指定範圍的記錄public List findByCriteria(DetachedCriteria criteria, int firstResult,
int maxResults) {
return getHibernateTemplate().findByCriteria(criteria, firstResult,
maxResults);
}
// 使用指定的實體及屬性檢索(滿足除主鍵外屬性=實體值)資料public List<T> findEqualByEntity(T entity, String[] propertyNames) {
Criteria criteria =this.createCriteria();
Example exam = Example.create(entity);
exam.excludeZeroes();
String[] defPropertys = getSessionFactory().getClassMetadata(
entityClass).getPropertyNames();
for (String defProperty : defPropertys) {
int ii =0;
for (ii =0; ii < propertyNames.length; ++ii) {
if (defProperty.equals(propertyNames[ii])) {
criteria.addOrder(Order.asc(defProperty));
break;
}
}
if (ii == propertyNames.length) {
exam.excludeProperty(defProperty);
}
}
criteria.add(exam);
return (List<T>) criteria.list();
}
// 使用指定的實體及屬性檢索(滿足屬性 like 串實體值)資料public List<T> findLikeByEntity(T entity, String[] propertyNames) {
Criteria criteria =this.createCriteria();
for (String property : propertyNames) {
try {
Object value = PropertyUtils.getProperty(entity, property);
if (value instanceof String) {
criteria.add(Restrictions.like(property, (String) value,
MatchMode.ANYWHERE));
criteria.addOrder(Order.asc(property));
} else {
criteria.add(Restrictions.eq(property, value));
criteria.addOrder(Order.asc(property));
}
} catch (Exception ex) {
// 忽略無效的檢索參考資料。 }
}
return (List<T>) criteria.list();
}
// 使用指定的檢索標準獲取滿足標準的記錄數public Integer getRowCount(DetachedCriteria criteria) {
criteria.setProjection(Projections.rowCount());
List list =this.findByCriteria(criteria, 0, 1);
return (Integer) list.get(0);
}
// 使用指定的檢索標準檢索資料,返回指定統計值(max,min,avg,sum)public Object getStatValue(DetachedCriteria criteria, String propertyName,
String StatName) {
if (StatName.toLowerCase().equals("max"))
criteria.setProjection(Projections.max(propertyName));
elseif (StatName.toLowerCase().equals("min"))
criteria.setProjection(Projections.min(propertyName));
elseif (StatName.toLowerCase().equals("avg"))
criteria.setProjection(Projections.avg(propertyName));
elseif (StatName.toLowerCase().equals("sum"))
criteria.setProjection(Projections.sum(propertyName));
elsereturnnull;
List list =this.findByCriteria(criteria, 0, 1);
return list.get(0);
}
// -------------------------------- Others --------------------------------
// 加鎖指定的實體publicvoid lock(T entity, LockMode lock) {
getHibernateTemplate().lock(entity, lock);
}
// 強制初始化指定的實體publicvoid initialize(Object proxy) {
getHibernateTemplate().initialize(proxy);
}
// 強制立即更新緩衝資料到資料庫(否則僅在事務提交時才更新)publicvoid flush() {
getHibernateTemplate().flush();
}
}
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import org.apache.commons.beanutils.PropertyUtils;
import org.hibernate.Criteria;
import
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Example;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
* GenericHibernateDao 繼承 HibernateDao,簡單封裝 HibernateTemplate 各項功能,
* 簡化基於Hibernate Dao 的編寫。
*
* @author lny
*/
@SuppressWarnings("unchecked")
publicclass GenericHibernateDao<T extends Serializable, PK extends Serializable>extends HibernateDaoSupport implements GenericDao<T, PK
// 實體類型別(由構造方法自動賦值)private Class<T> entityClass;
// 構造方法,根據例項類自動獲取實體類型別public GenericHibernateDao() {
this.entityClass =null;
Class c = getClass();
Type t = c.getGenericSuperclass();
if (t instanceof ParameterizedType) {
Type[] p = ((ParameterizedType) t).getActualTypeArguments();
this.entityClass = (Class<T>) p[0];
}
}
// -------------------- 基本檢索、增加、修改、刪除操作 --------------------
// 根據主鍵獲取實體。如果沒有相應的實體,返回 null。public T get(PK id) {
return (T) getHibernateTemplate().get(entityClass, id);
}
// 根據主鍵獲取實體並加鎖。如果沒有相應的實體,返回 null。public T getWithLock(PK id, LockMode lock) {
T t = (T) getHibernateTemplate().get(entityClass, id, lock);
if (t !=null) {
this.flush(); // 立即重新整理,否則鎖不會生效。 }
return t;
}
// 根據主鍵獲取實體。如果沒有相應的實體,丟擲異常。public T load(PK id) {
return (T) getHibernateTemplate().load(entityClass, id);
}
// 根據主鍵獲取實體並加鎖。如果沒有相應的實體,丟擲異常。public T loadWithLock(PK id, LockMode lock) {
T t = (T) getHibernateTemplate().load(entityClass, id, lock);
if (t !=null) {
this.flush(); // 立即重新整理,否則鎖不會生效。 }
return t;
}
// 獲取全部實體。public List<T> loadAll() {
return (List<T>) getHibernateTemplate().loadAll(entityClass);
}
// loadAllWithLock() ?
// 更新實體publicvoid update(T entity) {
getHibernateTemplate().update(entity);
}
// 更新實體並加鎖publicvoid updateWithLock(T entity, LockMode lock) {
getHibernateTemplate().update(entity, lock);
this.flush(); // 立即重新整理,否則鎖不會生效。 }
// 儲存實體到資料庫publicvoid save(T entity) {
getHibernateTemplate().save(entity);
}
// saveWithLock()?
// 增加或更新實體publicvoid saveOrUpdate(T entity) {
getHibernateTemplate().saveOrUpdate(entity);
}
// 增加或更新集合中的全部實體publicvoid saveOrUpdateAll(Collection<T> entities) {
getHibernateTemplate().saveOrUpdateAll(entities);
}
// 刪除指定的實體publicvoid delete(T entity) {
getHibernateTemplate().delete(entity);
}
// 加鎖並刪除指定的實體publicvoid deleteWithLock(T entity, LockMode lock) {
getHibernateTemplate().delete(entity, lock);
this.flush(); // 立即重新整理,否則鎖不會生效。 }
// 根據主鍵刪除指定實體publicvoid deleteByKey(PK id) {
this.delete(this.load(id));
}
// 根據主鍵加鎖並刪除指定的實體publicvoid deleteByKeyWithLock(PK id, LockMode lock) {
this.deleteWithLock(this.load(id), lock);
}
// 刪除集合中的全部實體publicvoid deleteAll(Collection<T> entities) {
getHibernateTemplate().deleteAll(entities);
}
// -------------------- HSQL ----------------------------------------------
// 使用HSQL語句直接增加、更新、刪除實體publicint bulkUpdate(String queryString) {
return getHibernateTemplate().bulkUpdate(queryString);
}
// 使用帶引數的HSQL語句增加、更新、刪除實體publicint bulkUpdate(String queryString, Object[] values) {
return getHibernateTemplate().bulkUpdate(queryString, values);
}
// 使用HSQL語句檢索資料public List find(String queryString) {
return getHibernateTemplate().find(queryString);
}
// 使用帶引數的HSQL語句檢索資料public List find(String queryString, Object[] values) {
return getHibernateTemplate().find(queryString, values);
}
// 使用帶命名的引數的HSQL語句檢索資料public List findByNamedParam(String queryString, String[] paramNames,
Object[] values) {
return getHibernateTemplate().findByNamedParam(queryString, paramNames,
values);
}
// 使用命名的HSQL語句檢索資料public List findByNamedQuery(String queryName) {
return getHibernateTemplate().findByNamedQuery(queryName);
}
// 使用帶引數的命名HSQL語句檢索資料public List findByNamedQuery(String queryName, Object[] values) {
return getHibernateTemplate().findByNamedQuery(queryName, values);
}
// 使用帶命名引數的命名HSQL語句檢索資料public List findByNamedQueryAndNamedParam(String queryName,
String[] paramNames, Object[] values) {
return getHibernateTemplate().findByNamedQueryAndNamedParam(queryName,
paramNames, values);
}
// 使用HSQL語句檢索資料,返回 Iteratorpublic Iterator iterate(String queryString) {
return getHibernateTemplate().iterate(queryString);
}
// 使用帶引數HSQL語句檢索資料,返回 Iteratorpublic Iterator iterate(String queryString, Object[] values) {
return getHibernateTemplate().iterate(queryString, values);
}
// 關閉檢索返回的 Iteratorpublicvoid closeIterator(Iterator it) {
getHibernateTemplate().closeIterator(it);
}
// -------------------------------- Criteria ------------------------------
// 建立與會話無關的檢索標準public DetachedCriteria createDetachedCriteria() {
return DetachedCriteria.forClass(this.entityClass);
}
// 建立與會話繫結的檢索標準public Criteria createCriteria() {
returnthis.createDetachedCriteria().getExecutableCriteria(
this.getSession());
}
// 檢索滿足標準的資料public List findByCriteria(DetachedCriteria criteria) {
return getHibernateTemplate().findByCriteria(criteria);
}
// 檢索滿足標準的資料,返回指定範圍的記錄public List findByCriteria(DetachedCriteria criteria, int firstResult,
int maxResults) {
return getHibernateTemplate().findByCriteria(criteria, firstResult,
maxResults);
}
// 使用指定的實體及屬性檢索(滿足除主鍵外屬性=實體值)資料public List<T> findEqualByEntity(T entity, String[] propertyNames) {
Criteria criteria =this.createCriteria();
Example exam = Example.create(entity);
exam.excludeZeroes();
String[] defPropertys = getSessionFactory().getClassMetadata(
entityClass).getPropertyNames();
for (String defProperty : defPropertys) {
int ii =0;
for (ii =0; ii < propertyNames.length; ++ii) {
if (defProperty.equals(propertyNames[ii])) {
criteria.addOrder(Order.asc(defProperty));
break;
}
}
if (ii == propertyNames.length) {
exam.excludeProperty(defProperty);
}
}
criteria.add(exam);
return (List<T>) criteria.list();
}
// 使用指定的實體及屬性檢索(滿足屬性 like 串實體值)資料public List<T> findLikeByEntity(T entity, String[] propertyNames) {
Criteria criteria =this.createCriteria();
for (String property : propertyNames) {
try {
Object value = PropertyUtils.getProperty(entity, property);
if (value instanceof String) {
criteria.add(Restrictions.like(property, (String) value,
MatchMode.ANYWHERE));
criteria.addOrder(Order.asc(property));
} else {
criteria.add(Restrictions.eq(property, value));
criteria.addOrder(Order.asc(property));
}
} catch (Exception ex) {
// 忽略無效的檢索參考資料。 }
}
return (List<T>) criteria.list();
}
// 使用指定的檢索標準獲取滿足標準的記錄數public Integer getRowCount(DetachedCriteria criteria) {
criteria.setProjection(Projections.rowCount());
List list =this.findByCriteria(criteria, 0, 1);
return (Integer) list.get(0);
}
// 使用指定的檢索標準檢索資料,返回指定統計值(max,min,avg,sum)public Object getStatValue(DetachedCriteria criteria, String propertyName,
String StatName) {
if (StatName.toLowerCase().equals("max"))
criteria.setProjection(Projections.max(propertyName));
elseif (StatName.toLowerCase().equals("min"))
criteria.setProjection(Projections.min(propertyName));
elseif (StatName.toLowerCase().equals("avg"))
criteria.setProjection(Projections.avg(propertyName));
elseif (StatName.toLowerCase().equals("sum"))
criteria.setProjection(Projections.sum(propertyName));
elsereturnnull;
List list =this.findByCriteria(criteria, 0, 1);
return list.get(0);
}
// -------------------------------- Others --------------------------------
// 加鎖指定的實體publicvoid lock(T entity, LockMode lock) {
getHibernateTemplate().lock(entity, lock);
}
// 強制初始化指定的實體publicvoid initialize(Object proxy) {
getHibernateTemplate().initialize(proxy);
}
// 強制立即更新緩衝資料到資料庫(否則僅在事務提交時才更新)publicvoid flush() {
getHibernateTemplate().flush();
}
}