在ssh整合开发中,会创建多个不同的dao层对数据库里的数据进行crud操作,其实每个里面用到的方法几乎都一样,只是传递的参数类型不同.我们可以抽取出一个BaseDao类.由于开发中的高内聚低耦合的思想,所以定义为一个接口,再创建实现类继承即可.在接口上定义传递类型的泛型,通过反射技术及Class类中的方法获取.
package cn.itcast.util;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;
public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T> {
//定义一个成员变量,以便后面的方法中使用
private Class clazz;
public BaseDaoImpl() {
//用Object类中的getClass()方法,获取当前运行类的class对象
Class c = this.getClass();
//得到当前运行类的父类的参数化类型
//Type getGenericSuperclass()
//返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的直接超类的 Type。
Type type = c.getGenericSuperclass();
//ParameterizedType是Type的子类,将Type强转为ParameterizedType类型
ParameterizedType ptype = (ParameterizedType) type;
// Type[] getActualTypeArguments()
// 返回表示此类型实际类型参数的 Type 对象的数组。
Type[] t = ptype.getActualTypeArguments();
//获取实际类型参数
this.clazz = (Class) t[0];
System.out.println(clazz);//--->class cn.itcast.entity.CusVisit全类名
}
@Override
public void save(T t) {
//调用HibernateTemplate模本中的方法
this.getHibernateTemplate().save(t);
}
@Override
public void update(T t) {
this.getHibernateTemplate().update(t);
}
@Override
public void delete(T t) {
this.getHibernateTemplate().delete(t);
}
@Override
public T get(int id) {
T t = (T) this.getHibernateTemplate().get(clazz, id);
return t;
}
@Override
public List<T> list() {
// String getSimpleName()
//返回源代码中给出的底层类的简称
String hql = "from "+clazz.getSimpleName();//-->CusVisit (类名)
List<T> list = (List<T>) this.getHibernateTemplate().find(hql);
return list;
}
}