引用維基百科的定義: html
泛型的定義主要有如下兩種: java
泛型的好處是在編譯的時候檢查類型安全,而且全部的強制轉換都是自動和隱式的,提升代碼的重用率。 api
泛型只不過是java中的類型而已,繼承自Type接口。 數組
泛型的意義在於:在抽象的時候泛化,在具體的時候細化,在編譯的時候就能夠決定泛化的值。通俗得講,能夠將泛型看作是類或者接口帶了一個參數,這個參數能夠在屬性、方法的參數、方法的返回值中使用使用。 安全
ParameterizedType有以下幾個方法: session
Type[] | getActualTypeArguments() 返回表示此類型實際類型參數的 Type 對象的數組。 |
Type | getOwnerType() 返回 Type 對象,表示此類型是其成員之一的類型。 |
Type | getRawType() 返回 Type 對象,表示聲明此類型的類或接口。 |
actualTypeArguments指類的參數 ui
rawType指帶了參數的類或者接口 this
瞭解這些以後,就能夠對使用了Hibernate的Dao進行一次CRUD的重構。
import java.lang.reflect.ParameterizedType; import java.util.Collection; import javax.annotation.Resource; import org.hibernate.Query; import org.hibernate.SessionFactory; /** * 超類dao實現,專門用於繼承 */ @SuppressWarnings("unchecked") public abstract class BaseDaoImpl<T> implements BaseDao<T> { //注入會話工廠 @Resource(name="sessionFactory") private SessionFactory sf ; private Class<T> clazz ; /** * 一、this表明該類的子類 * 二、this.getClass().getGenericSuperclass()表明該類 * 三、type.getActualTypeArguments()[0]就是T * 四、type.getRawType()就是BaseDaoImpl */ public BaseDaoImpl(){ ParameterizedType type = (ParameterizedType) this.getClass().getGenericSuperclass(); clazz = (Class<T>) type.getActualTypeArguments()[0]; } public void saveEntity(T t) { sf.getCurrentSession().save(t); } public void updateEntity(T t) { sf.getCurrentSession().update(t); } public void saveOrUpdateEntity(T t) { sf.getCurrentSession().saveOrUpdate(t); } public void deleteEntity(T t) { sf.getCurrentSession().delete(t); } //批量更新 public void batchEntityByHQL(String hql, Object... objects) { Query q = sf.getCurrentSession().createQuery(hql); for(int i = 0 ; i < objects.length ; i ++){ q.setParameter(i, objects[i]); } q.executeUpdate(); } public T getEntity(Integer id) { return (T) sf.getCurrentSession().get(clazz, id); } public T loadEntity(Integer id) { return (T) sf.getCurrentSession().load(clazz, id); } public Collection<T> findEntityByHQL(String hql, Object... objects) { Query q = sf.getCurrentSession().createQuery(hql); for(int i = 0 ; i < objects.length ; i ++){ q.setParameter(i, objects[i]); } return q.list(); } }
其餘的dao只要繼承此類便可。 編碼
另外推薦兩篇文章: spa