您的位置:首页 > 其它

BaseDao的抽取

2016-07-19 14:36 127 查看
在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;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ssh Base Dao