泛型DAO介面spring_hibernate_實現
spring_hibernate_實現
首先定義介面泛型DAO介面 GenericDao
package com.th.huz;
import java.io.Serializable;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.LockMode;
import org.hibernate.criterion.DetachedCriteria;
/**
*
* @author lny
*/
public interface GenericDao<T extends Serializable, PK extends Serializable> {
// -------------------- 基本檢索、增加、修改、刪除操作 --------------------
// 根據主鍵獲取實體。如果沒有相應的實體,返回 null。
public T get(PK id);
// 根據主鍵獲取實體並加鎖。如果沒有相應的實體,返回 null。
public T getWithLock(PK id, LockMode lock);
// 根據主鍵獲取實體。如果沒有相應的實體,丟擲異常。
public T load(PK id);
// 根據主鍵獲取實體並加鎖。如果沒有相應的實體,丟擲異常。
public T loadWithLock(PK id, LockMode lock);
// 獲取全部實體。
public List<T> loadAll();
// loadAllWithLock() ?
// 更新實體
public void update(T entity);
// 更新實體並加鎖
public void updateWithLock(T entity, LockMode lock);
// 儲存實體到資料庫
public void save(T entity);
// saveWithLock()
// 增加或更新實體
public void saveOrUpdate(T entity);
// 增加或更新集合中的全部實體
public void saveOrUpdateAll(Collection<T> entities);
// 刪除指定的實體
public void delete(T entity);
// 加鎖並刪除指定的實體
public void deleteWithLock(T entity, LockMode lock);
// 根據主鍵刪除指定實體
public void deleteByKey(PK id);
// 根據主鍵加鎖並刪除指定的實體
public void deleteByKeyWithLock(PK id, LockMode lock);
// 刪除集合中的全部實體
public void deleteAll(Collection<T> entities);
// -------------------- HSQL ----------------------------------------------
// 使用HSQL語句直接增加、更新、刪除實體
public int bulkUpdate(String queryString);
// 使用帶引數的HSQL語句增加、更新、刪除實體
public int bulkUpdate(String queryString, Object[] values);
// 使用HSQL語句檢索資料
public List find(String queryString);
// 使用帶引數的HSQL語句檢索資料
public List find(String queryString, Object[] values);
// 使用帶命名的引數的HSQL語句檢索資料
public List findByNamedParam(String queryString, String[] paramNames,
Object[] values);
// 使用命名的HSQL語句檢索資料
public List findByNamedQuery(String queryName);
// 使用帶引數的命名HSQL語句檢索資料
public List findByNamedQuery(String queryName, Object[] values);
// 使用帶命名引數的命名HSQL語句檢索資料
public List findByNamedQueryAndNamedParam(String queryName,
String[] paramNames, Object[] values);
// 使用HSQL語句檢索資料,返回 Iterator
public Iterator iterate(String queryString);
// 使用帶引數HSQL語句檢索資料,返回 Iterator
public Iterator iterate(String queryString, Object[] values);
// 關閉檢索返回的 Iterator
public void closeIterator(Iterator it);
// -------------------------------- Criteria ------------------------------
// 建立與會話無關的檢索標準物件
public DetachedCriteria createDetachedCriteria();
// 建立與會話繫結的檢索標準物件
public Criteria createCriteria();
// 使用指定的檢索標準檢索資料
public List findByCriteria(DetachedCriteria criteria);
// 使用指定的檢索標準檢索資料,返回部分記錄
public List findByCriteria(DetachedCriteria criteria, int firstResult,
int maxResults);
// 使用指定的實體及屬性檢索(滿足除主鍵外屬性=實體值)資料
public List<T> findEqualByEntity(T entity, String[] propertyNames);
// 使用指定的實體及屬性(非主鍵)檢索(滿足屬性 like 串實體值)資料
public List<T> findLikeByEntity(T entity, String[] propertyNames);
// 使用指定的檢索標準檢索資料,返回指定範圍的記錄
public Integer getRowCount(DetachedCriteria criteria);
// 使用指定的檢索標準檢索資料,返回指定統計值
public Object getStatValue(DetachedCriteria criteria, String propertyName,
String StatName);
// -------------------------------- Others --------------------------------
// 加鎖指定的實體
public void lock(T entity, LockMode lockMode);
// 強制初始化指定的實體
public void initialize(Object proxy);
// 強制立即更新緩衝資料到資料庫(否則僅在事務提交時才更新)
public void flush();
}
實現GenericDao介面的Hibernate的實現類 GenericHibernateDao
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")
public class 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() ?
// 更新實體
public void update(T entity) {
getHibernateTemplate().update(entity);
}
// 更新實體並加鎖
public void updateWithLock(T entity, LockMode lock) {
getHibernateTemplate().update(entity, lock);
this.flush(); // 立即重新整理,否則鎖不會生效。
}
// 儲存實體到資料庫
public void save(T entity) {
getHibernateTemplate().save(entity);
}
// saveWithLock()?
// 增加或更新實體
public void saveOrUpdate(T entity) {
getHibernateTemplate().saveOrUpdate(entity);
}
// 增加或更新集合中的全部實體
public void saveOrUpdateAll(Collection<T> entities) {
getHibernateTemplate().saveOrUpdateAll(entities);
}
// 刪除指定的實體
public void delete(T entity) {
getHibernateTemplate().delete(entity);
}
// 加鎖並刪除指定的實體
public void deleteWithLock(T entity, LockMode lock) {
getHibernateTemplate().delete(entity, lock);
this.flush(); // 立即重新整理,否則鎖不會生效。
}
// 根據主鍵刪除指定實體
public void deleteByKey(PK id) {
this.delete(this.load(id));
}
// 根據主鍵加鎖並刪除指定的實體
public void deleteByKeyWithLock(PK id, LockMode lock) {
this.deleteWithLock(this.load(id), lock);
}
// 刪除集合中的全部實體
public void deleteAll(Collection<T> entities) {
getHibernateTemplate().deleteAll(entities);
}
// -------------------- HSQL ----------------------------------------------
// 使用HSQL語句直接增加、更新、刪除實體
public int bulkUpdate(String queryString) {
return getHibernateTemplate().bulkUpdate(queryString);
}
// 使用帶引數的HSQL語句增加、更新、刪除實體
public int 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語句檢索資料,返回 Iterator
public Iterator iterate(String queryString) {
return getHibernateTemplate().iterate(queryString);
}
// 使用帶引數HSQL語句檢索資料,返回 Iterator
public Iterator iterate(String queryString, Object[] values) {
return getHibernateTemplate().iterate(queryString, values);
}
// 關閉檢索返回的 Iterator
public void closeIterator(Iterator it) {
getHibernateTemplate().closeIterator(it);
}
// -------------------------------- Criteria ------------------------------
// 建立與會話無關的檢索標準
public DetachedCriteria createDetachedCriteria() {
return DetachedCriteria.forClass(this.entityClass);
}
// 建立與會話繫結的檢索標準
public Criteria createCriteria() {
return this.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));
else if (StatName.toLowerCase().equals("min"))
criteria.setProjection(Projections.min(propertyName));
else if (StatName.toLowerCase().equals("avg"))
criteria.setProjection(Projections.avg(propertyName));
else if (StatName.toLowerCase().equals("sum"))
criteria.setProjection(Projections.sum(propertyName));
else
return null;
List list = this.findByCriteria(criteria, 0, 1);
return list.get(0);
}
// -------------------------------- Others --------------------------------
// 加鎖指定的實體
public void lock(T entity, LockMode lock) {
getHibernateTemplate().lock(entity, lock);
}
// 強制初始化指定的實體
public void initialize(Object proxy) {
getHibernateTemplate().initialize(proxy);
}
// 強制立即更新緩衝資料到資料庫(否則僅在事務提交時才更新)
public void flush() {
getHibernateTemplate().flush();
}
}
相關文章
- Hibernate 泛型實現 dao 層的基類泛型
- TypeScript 泛型介面和泛型類TypeScript泛型
- 介面即泛型泛型
- Java中如何使用泛型實現介面中的列表集合?Java泛型
- TS系列之介面/類/泛型泛型
- MyBatis進階--介面代理方式實現Dao 和動態SQLMyBatisSQL
- 泛型最佳實踐:Go泛型設計者教你如何用泛型泛型Go
- TS類,介面,泛型的簡介泛型
- TypeScript學習(四)—— 介面和泛型TypeScript泛型
- C 語言實現泛型 swap 函式泛型函式
- 在C語言中實現泛型程式設計C語言泛型程式設計
- C語言如何實現泛型程式設計?C語言泛型程式設計
- 泛型類、泛型方法及泛型應用泛型
- 【java】【泛型】泛型geneticJava泛型
- Java泛型及實踐Java泛型
- java 介面,介面的特性,介面實現多型,面向介面程式設計Java多型程式設計
- 泛型類和泛型方法泛型
- 泛型--泛型萬用字元和泛型的上下限泛型字元
- C#中的介面和泛型集合探討C#泛型
- Go 泛型之泛型約束Go泛型
- 其實泛型很簡單泛型
- C# 8新提案讓泛型Attribute成為現實C#泛型
- 泛型泛型
- [MAUI程式設計]介面多型與實現UI程式設計多型
- 簡單易懂的 Go 泛型使用和實現原理介紹Go泛型
- 型別 VS 泛型型別泛型
- TypeScript 泛型型別TypeScript泛型型別
- 泛型類、泛型方法、型別萬用字元的使用泛型型別字元
- 泛型viewmodle泛型View
- Java泛型Java泛型
- Go 泛型Go泛型
- 泛型(Generic)泛型
- 泛型(一)泛型
- 泛型(三)泛型
- 泛型(二)泛型
- 泛型(四)泛型
- 泛型(五)泛型
- 在feign介面中返回泛型類(Generic response support for feign client)泛型client
- 【.NET】利用 IL 魔法實現隨心隨意的泛型約束泛型