Hibernate中BaseDao抽取(反射泛型)

在BaseDao中使用反射+泛型可以简化代码

public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T> {

	private Class pClass;
	//构造方法(这里是核心)
	public BaseDaoImpl() {
		//第一步 得到当前运行类Class
		Class clazz = this.getClass();
//		System.out.println("****************"+clazz);
		
		//第二步 得到运行类的 父类的参数化类型 BaseDaoImpl<Customer>
		// Type getGenericSuperclass()  
		Type type = clazz.getGenericSuperclass();
		// 使用Type子接口 ParameterizedType
		ParameterizedType ptype = (ParameterizedType) type;
//		System.out.println("***********"+ptype);
		
		//第三步 得到实际类型参数<Customer>里面Customer
		//Type[] getActualTypeArguments() 
		Type[] types = ptype.getActualTypeArguments();
		//Type接口实现类Class
		Class tclass = (Class) types[0];
//		System.out.println("*****"+pclass);
		this.pClass = tclass;
	}
	
	//根据id查询
	@SuppressWarnings("all")
	public T findOne(int id) {
		//不能写 T.class
		return (T) this.getHibernateTemplate().get(pClass, id);
	}

	//查询所有
	@SuppressWarnings("all")
	public List<T> findAll() {
		//使用Class里面getSimpleName() 得到类名称
		return (List<T>) this.getHibernateTemplate().find("from "+pClass.getSimpleName());
	}
	
	//添加
	public void add(T t) {
		this.getHibernateTemplate().save(t);
	}
	
	//修改
	public void update(T t) {
		this.getHibernateTemplate().update(t);
	}

	//删除
	public void delete(T t) {
		this.getHibernateTemplate().delete(t);
	}
}

后面的Dao包下的类只需要继承BaseDao就拥有了它的方法。

public class CustomerDaoImpl extends BaseDaoImpl<Customer>  {   ...}
发布了24 篇原创文章 · 获赞 14 · 访问量 662

猜你喜欢

转载自blog.csdn.net/weixin_44860598/article/details/104522621