java 泛型實現Dao 操作的重用

        增刪改查幾乎是所有Dao不可與數據庫進行交互的不可避免的操作。在java jdk  1.5 以後提供了泛型可以實現大量重用Dao的增傷改查代碼。 所以小編覺得有必要做個筆記。
     1   泛型crud重用首先向要創建一個通用的泛型接口     
package com.wuyihuai.oa.dao.base;


import java.io.Serializable;
import java.util.Collection;
/**
 * 基類接口
* 這是註釋
* @author wuyihuai
* 郵箱[email protected]
* 下午7:11:34
 */
public interface CommonDao<T> {
       //保存
            public void save(T t);
            //查詢所有
            public Collection<T> getAllEntity();
            //根據id查詢
            public T getEntityById(Serializable id);
            //更新
            public void updateEntity(T t);
            //刪除
            public void deleteEntity(Serializable id);
}
  2 創建基於泛型接口的實現類 並且繼承HibernateDaoSupport重而使用hibernate框架 以實現基本的增傷改查。
   
package com.wuyihuai.oa.dao.base.impl;


import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.Collection;


import org.springframework.orm.hibernate3.support.HibernateDaoSupport;


import com.wuyihuai.oa.dao.base.CommonDao;
/**
 * 實現基本
* 這是註釋
* @author wuyihuai
* 郵箱[email protected]
* 下午7:11:06
 */
public class CommonDaoImlp<T> extends HibernateDaoSupport implements CommonDao<T>{
    private Class classT;
    public CommonDaoImlp(){
      /**
       * CommonDaoImpl<T> 是一個被參數化的類
       * CommonDao<T>  是一個被參數化的接口
       * ParameterizedType 是被參數化的類型   也就是返回帶泛型的類 
       *         一個被參數化的類由兩個部分組成 例如CommonDaoImlp<T>
       *                rawType: 代表CommonDaoImlp
       *                actualTypeArguments :代表T   
       * this.getClass 僅表 CommonDaoImpl 並不代表CommonDaoImpl<T> 
       * type.getActualTypeArguments()[0]返回的是一個數組     獲取第一個泛行類
       */
       //被參數化的類 
      ParameterizedType type= (ParameterizedType) this.getClass().getGenericSuperclass();
           //獲取泛型類
      this.classT=(Class) type.getActualTypeArguments()[0];
           System.err.println(classT.getName());
    }
@Override
public void save(T t) {
// TODO Auto-generated method stub
 this.getHibernateTemplate().save(t);
}


@Override
public Collection<T> getAllEntity() {
// TODO Auto-generated method stub
return this.getHibernateTemplate().find("from"+classT.getName());
}


@Override
public T getEntityById(Serializable id) {
// TODO Auto-generated method stub
return (T) this.getHibernateTemplate().get(classT, id);
}


@Override
public void updateEntity(T t) {
// TODO Auto-generated method stub
  this.getHibernateTemplate().update(t);
  this.getHibernateTemplate().flush();
}


@Override
public void deleteEntity(Serializable id) {
// TODO Auto-generated method stub
 T t=(T) this.getHibernateTemplate().get(classT, id);
 this.getHibernateTemplate().delete(t);
 this.getHibernateTemplate().flush();
}


}
    3 到此curd的重用便實現了,接下來便是調用使用該類   在使用該泛型時爲實現MVC首先要  創建一個實體類的接口繼承CommonDao<T>
      
package com.wuyihuai.oa.dao;


import java.io.Serializable;


import com.wuyihuai.oa.dao.base.CommonDao;
import com.wuyihuai.oa.domain.Person;


public interface PersonDao<T> extends CommonDao<T> {
       /**
        * 在此增加 除增刪改查之外的操作。
        * 本例中 只例舉增刪查改的操作
        * 故該接口內不在添加新的操作
        */
}
   4 接下來是創建PersonDao的實現類PersonDaoImpl 讓其繼承 CommonDaoImlp<T>和實現PersonDao<T>
便可以了
    
package com.wuyihuai.oa.dao.impl;


import java.io.Serializable;


import org.springframework.orm.hibernate3.support.HibernateDaoSupport;


import com.wuyihuai.oa.dao.PersonDao;
import com.wuyihuai.oa.dao.PostDao;
import com.wuyihuai.oa.dao.base.impl.CommonDaoImlp;
import com.wuyihuai.oa.domain.Person;


public class PersonDaoImpl extends CommonDaoImlp<Person> implements PersonDao<Person>{




}
  這要便實現了泛型從用所有的Dao由原先每個類都要寫一遍增刪改查 ,變成就只寫一遍提高了代碼的重用性。







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章