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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值