增刪改查幾乎是所有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由原先每個類都要寫一遍增刪改查 ,變成就只寫一遍提高了代碼的重用性。
java 泛型實現Dao 操作的重用
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章
(六)泛型-泛型應用之不同實體間同名屬性的自動賦值-BeanUtils 的使用
bestcxx
2018-09-03 19:24:06
關於對 java 泛型中T extendscompareable
yqme
2020-06-13 17:17:56
Java 理論和實踐: 瞭解泛型
iteye_19166
2020-02-22 09:29:17
java 在一個方法中返回一個泛型變量
寒林一带
2018-12-07 13:11:17
10 道關於 Java 泛型的面試題
茅坤宝骏氹
2018-11-04 15:39:57
揭開Java 泛型類型擦除神祕面紗
茅坤宝骏氹
2018-10-04 10:36:12
學習筆記之泛型
iteye_20909
2018-09-06 04:37:24
Java泛型的注意事項以及使用
Retror
2018-09-03 07:48:08
黑馬程序員--java高新技術----泛型
hongto57
2018-09-01 10:10:34
關於對 java 泛型中T extendscompareable<? super T>理解
yqme
2018-08-27 19:50:57
黑馬程序員__Java中的泛型
zhaoyanyan_2011
2018-08-23 23:58:14
24小時熱門文章