通用dao写法 (spring4+hibernate4),主要是反射泛型

    xiaoxiao2021-03-25  102

    通用Dao写法1.定义BaseDao接口,IBaseDao<T>,定义了增删查改方法;2.实现BaseDao接口,继承HibernateDaoSupport ,有属性sessionFactory;由于要使泛型T能够实例化才能进行增删查改方法,所以要有构造方法,初始化Class<T> clazz属性,这里用到反射泛型,来获取子类的类型,然后重写接口里的方法,利用构造方法初始化的泛型得知类名,进行增删查改方法的重写3.在spring配置文件中定义并注入sessionFactory<bean id="baseDao" abstract="true"> <property name="sessionFactory" ref="sessionFactory" /></bean>

    4.要继承baseDao类的类在spring中注入

    <bean id="abcDao" class="AbcDao类的全限定名" parent="baseDao" />

    5.之后就可以在service层中使用了

    这里说说反射泛型

    public class BaseDaoimpl<T> extends HibernateDaoSupport implements IBaseDao<T>{ // 当前操作的实际的bean类型 private Class<T> clazz; // 获取类名称 private String className; // 反射泛型,目的是知道 T 的实际类型,使得类型 T 可以实例化 public BaseDao(){ Type type = this.getClass().getGenericSuperclass();//带有泛型的父类 ParameterizedType pt = (ParameterizedType) type; // 转换为参数化类型,即泛型 Type types[] = pt.getActualTypeArguments(); // 得到实际类型,泛型可能有多个,所以是数组 clazz = (Class<T>) types[0]; // 获取实际类型 className = clazz.getSimpleName(); } @Override public void save(T entity) { getHibernateTemplate().save(entity); } @Override public T findObjectById(Integer id) { return getHibernateTemplate().get(clazz, id); } @Override public List<T> findObjects() { Query query = currentSession().createQuery("FROM " + clazz.getSimpleName()); return query.list(); } //其他增删查改依此类推 }

    getClass().getGenericSuperclass()返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的直接超类的 Type

    eg. A是继承了此类的子类,在子类初始化的时候会调用父类的无参构造器,即上面的方法,上面的this=A.class,getGenericSuperclass()方法会得到父类也就是BaseDaoimpl<A>,getActualTypeArguments()会获得泛型的类型,不过没强转之前是Class类的,强转之后才会得到泛型的类型,Class<T>这个泛型类型,JVM在编译的时候能够推测出是上面类型

    转载请注明原文地址: https://ju.6miu.com/read-15517.html

    最新回复(0)