您的位置:首页 > 其它

使用getGenericSuperclass()和getActualTypeArguments()将DAO做成泛型

2014-02-27 09:51 459 查看
CommonDao.java

package com.itheima03.oa.dao.base;

import java.io.Serializable;
import java.util.Collection;

public interface CommonDao<T> {
public Collection<T> getAllEntry();

public T getEntryById(Serializable id);

public void updateEntry(T t);

public void saveEntry(T t);

public void deleteEntry(Serializable id);
}


CommonDaoImpl.java

package com.itheima03.oa.dao.base.impl;

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

import java.util.Collection;
import java.util.HashSet;

import javax.annotation.Resource;

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

import com.itheima03.oa.dao.base.CommonDao;

public class CommonDaoImpl<T>  implements CommonDao<T>{

@Resource(name="hibernateTemplate")
public HibernateTemplate hibernateTemplate;

private Class classt;

public CommonDaoImpl(){
ParameterizedType type = (ParameterizedType)this.getClass().getGenericSuperclass();
this.classt = (Class)type.getActualTypeArguments()[0];
type.getRawType();
}

@Override
public void deleteEntry(Serializable id) {
T t = this.getEntryById(id);
this.hibernateTemplate.delete(t);
}

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

@Override
public T getEntryById(Serializable id) {
// TODO Auto-generated method stub
return (T)this.hibernateTemplate.get(this.classt, id);
}

@Override
public void saveEntry(T t) {
// TODO Auto-generated method stub
this.hibernateTemplate.save(t);
}

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

}


上述代码中,CommonDaoImpl.java的构造函数,实现Dao泛型。

UserDao.java

package com.itheima03.oa.dao;

import java.util.Collection;

import com.itheima03.oa.dao.base.CommonDao;
import com.itheima03.oa.domain.User;

public interface UserDao<T> extends CommonDao<T>{
public Collection<User> getAllUser();

public User getUserByUAndP(String username,String password);
}


UserDao中再也不用写增删改查了。直接写个性化的操作就行了。

说明: getGenericSuperclass() 通过反射获取当前类表示的实体(类,接口,基本类型或void)的直接父类的Type,getActualTypeArguments()返回参数数组。

这时,我们就可以使用泛型来简化DAO的操作,省去了写N多有重复的方法的DAO的时间。

ps:以上代码,基于SSH框架
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐