利用反射泛型编写一个通用Dao

来源:互联网 发布:淘宝联盟批量链接工具 编辑:程序博客网 时间:2024/05/22 06:58

首先明确几个概念:

ArrayList<E>: E为类型参数变量

ArrayList<Integer> :Integer为实际参数变量

ArrayList<E>: 整个表达式称为参数化类型,对应类型为ParameterizedType


在数据库编程中,需要编写很多DAO,对数据库的操作包括增删改查,利用泛型技术和类的继承,可以编写一个通用的BaseDao, BaseDao负责实现这些增删改查操作。

下面是基于Hieberate的实现:

BaseDao类

import org.hibernate.Session;public class BaseDao<T> { //T类型由子类指定private Class clazz;private Session session;通过子类调用父类构造函数,来获取子类传过来的子类ClassBaseDao(Class clazz){this.clazz = clazz;System.out.println(this.clazz);}public void add(T t){session.save(t);}public T find(String id){return (T)session.get(clazz, id);}public void update(String id){session.update(id);}public void del(String id){T t = (T)session.get(clazz, id);session.delete(t);}}
子类的实现:子类在继承BaseDao时,指明Store类型

public class StoreDao extends BaseDao<Store>{StoreDao() {super(Store.class);// TODO Auto-generated constructor stub}}
public class BookDao extends BaseDao<Book> {BookDao() {super(Book.class);// TODO Auto-generated constructor stub}}

测试程序:

public static void main(String[] args) {// TODO Auto-generated method stubBookDao bDao = new BookDao();StoreDao sDao = new StoreDao();}
输出:

class cn.itcast.generic.Bookclass cn.itcast.generic.Store

上面的程序时通过之类在创建构造函数时,通过调用父类的有参构造函数将子类的Class,传给BaseDao。在此可以使用泛型反射方法对上类进行改造。其目的是让BaseDao自己在其内部获取到子类指定的T(即下例中的Book)类型,如:

public class BookDao extends BaseDao<Book>
这样子类就不用通过调用父类的构造函数将其指定的Class传递给BaseDao.下面是改造后的程序:

BaseDao(){clazz = this.getClass(); //获取子类的Class,如BookDao.classParameterizedType pt = (ParameterizedType) clazz.getGenericSuperclass(); //获取子类的父类泛型参数,///即类似BookDao<Book>clazz = (Class)pt.getActualTypeArguments()[0];//即获取到BookDao<Book>中的BookSystem.out.println(clazz);}
子类可以直接写成如下:

public class BookDao extends BaseDao<Book> {}
public class StoreDao extends BaseDao<Store>{}
和之前同样的测试程序,获得同样的测试结果

0 0
原创粉丝点击