BaseDao是什么
(1)可以把dao层重复代码抽取
(2)在dao里面做crud操作,调用hibernateTemplate里面的方法都一样,只是传递参数不一样。如果添加客户传递客户对象,如果添加联系人传递联系人对象
技术:反射+泛型
泛型术语介绍
(1)List<User>
* < >:称为typeof
* List<User>整体部分,称为参数化类型
* <>里面User,这个User,称为实际类型参数
第一步创建BaseDao接口,定义crud操作的方法
/**
* 创建接口,定义crud操作方法
* 在类或者接口上面添加<>,里面大写字母,泛型类,
* 大写字母代表任意类型
*/
publicinterface BaseDao<T>{
//添加
publicvoid add(Tt);
//修改
publicvoid update(Tt);
//删除
publicvoid delete(Tt);
//根据id查询
publicTfindOne(intid);
//查询所有
public List<T> findAll();
}
第二步创建BaseDao接口实现类,实现crud操作的方法
publicclass BaseDaoImpl<T>extends HibernateDaoSupportimplements BaseDao<T> {
privateClassclazz;
//根据id查询
@SuppressWarnings("unchecked")
public T findOne(intid) {
//get方法第一个参数传递实体类class
return (T)this.getHibernateTemplate().get(clazz,id);
}
//查询所有
@SuppressWarnings("unchecked")
public List<T> findAll(){
return (List<T>)this.getHibernateTemplate().find("from"+clazz.getSimpleName());
}
//添加
publicvoid add(Tt) {
this.getHibernateTemplate().save(t);
}
//修改
publicvoid update(Tt) {
this.getHibernateTemplate().update(t);
}
//删除
publicvoid delete(Tt) {
this.getHibernateTemplate().delete(t);
}
}
第三步让具体接口继承BaseDao接口
(1)去掉crud操作的方法
第四步让具体接口实现类继承BaseDao实现类
(1)去掉crud操作的方法
第一种实现:在BaseDaoImpl实现类里面获取实体类class
第二种实现:使用反射术语操作
* List<User>整体部分:称为参数化类型
* <User>:里面User,称为实际类型参数
//生成无参数构造
public BaseDaoImpl() {
//1获取子类对象class
Class clazz = this.getClass();
//2获取参数化类型 getGenericSuperclass()
//返回Type代表参数化类型,一般使用这个Type接口子接口ParameterizedType
Type type = clazz.getGenericSuperclass();
ParameterizedType ptype = (ParameterizedType) type;
//3获取实际类型参数 getActualTypeArguments()
// Type[]数组类型
Type[] types = ptype.getActualTypeArguments();
Class tclass = (Class) types[0];
this.clazz =tclass;
}