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框架