通用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>
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在编译的时候能够推测出是上面类型