對Java泛型的簡單理解,並對Hibernate Dao重構

引用維基百科的定義: html

    泛型的定義主要有如下兩種: java

  1. 在程序編碼中一些包含類型參數的類型,也就是說泛型的參數只能夠表明類,不能表明個別對象。(這是當今較常見的定義)
  2. 在程序編碼中一些包含參數的。其參數能夠表明類或對象等等。(如今人們大多把這稱做模板)

        泛型的好處是在編譯的時候檢查類型安全,而且全部的強制轉換都是自動和隱式的,提升代碼的重用率。 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

        Java泛型簡明教程

        Java 理論和實踐: 瞭解泛型

相關文章
相關標籤/搜索