BaseDao实现Dao层代码优化

来源:互联网 发布:淘宝1元拍卖真的吗 编辑:程序博客网 时间:2024/06/05 00:58

在Dao层不同模块中,比如用户,联系人中的crud操作都有很多相同的方法,只是传的参数不同而已,可以将这些方法使用泛型进行统一起来。

         1、写实现类BaseDao

public class BaseDao<T> extends HibernateDaoSupport  {
private  Class BaseClass;

public BaseDao() {                    //构造方法,子类继承是,创建子类实例会自动调用
Class class1=this.getClass();     //得到运行时类名,如有子类继承该类,则得到的是子类
    Type type=class1.getGenericSuperclass();    //得到运行时子类继承的父类,即BaseDaoImpl<T>,当然T是具体类
ParameterizedType pType=(ParameterizedType) type;   //一般是用Type子接口ParameterizedType中的方法
Type[] types=pType.getActualTypeArguments();   //得到泛型的类型,有时候不止一个,所以返回是数组
Class pClass=(Class) types[0];                          //得到T,强转为Class              
this.BaseClass=pClass;                         //给成员赋值,下面就可以使用了
}
public void add(T t) {
this.getHibernateTemplate().save(t);
}
public void delete(T t) {
this.getHibernateTemplate().delete(t);
}
public void update(T t) {
this.getHibernateTemplate().update(t);
}
@SuppressWarnings("all")
public T findOne(int cid) {
return (T) this.getHibernateTemplate().get(BaseClass, cid);  / /由于这里要用到类,但是泛型不能写 T.class,所以上面用反射机制来得到泛型T具体的类

}
@SuppressWarnings("all")
public List<T> list() {
return (List<T>) this.getHibernateTemplate().find("from "+ BaseClass.getSimpleName());
}
}

   2、Dao层不同模块的类去继承BaseDao

public class CustomerDao extends BaseDao<Customer>  {

                数据库crud操作不用在写

}

public class Link extends BaseDao<Customer> {

                数据库crud操作不用在写

}


3 、这样就将Dao中相同的方法给抽取出来,主要记住,如何用反射去得到BaseDao<T>中T的具体类是什么


原创粉丝点击