对Java泛型的简单理解,并对Hibernate Dao重构

引用维基百科的定义: html

    泛型的定义主要有如下两种: java

  1. 在程序编码中一些包含类型参数的类型,也就是说泛型的参数只能够表明类,不能表明个别对象。(这是当今较常见的定义)
  2. 在程序编码中一些包含参数的。其参数能够表明类或对象等等。(如今人们大多把这称做模板)

        泛型的好处是在编译的时候检查类型安全,而且全部的强制转换都是自动和隐式的,提升代码的重用率。 api

泛型只不过是java中的类型而已,继承自Type接口。 数组

泛型的意义在于:在抽象的时候泛化,在具体的时候细化,在编译的时候就能够决定泛化的值。通俗得讲,能够将泛型看作是类或者接口带了一个参数,这个参数能够在属性、方法的参数、方法的返回值中使用使用。 安全

ParameterizedType有以下几个方法: session

 Type[] getActualTypeArguments() 
          返回表示此类型实际类型参数的 Type 对象的数组。
 Type getOwnerType() 
          返回 Type 对象,表示此类型是其成员之一的类型。
 Type getRawType() 
          返回 Type 对象,表示声明此类型的类或接口。

actualTypeArguments指类的参数 ui

rawType指带了参数的类或者接口 this

了解这些以后,就能够对使用了Hibernate的Dao进行一次CRUD的重构。


import java.lang.reflect.ParameterizedType;
import java.util.Collection;

import javax.annotation.Resource;

import org.hibernate.Query;
import org.hibernate.SessionFactory;

/**
 * 超类dao实现,专门用于继承
 */
@SuppressWarnings("unchecked")
public abstract class BaseDaoImpl<T> implements BaseDao<T> {

	//注入会话工厂
	@Resource(name="sessionFactory")
	private SessionFactory sf ;
	
	private Class<T> clazz ;
        /**
	 * 一、this表明该类的子类
	 * 二、this.getClass().getGenericSuperclass()表明该类
	 * 三、type.getActualTypeArguments()[0]就是T
	 * 四、type.getRawType()就是BaseDaoImpl
	 */
        public BaseDaoImpl(){
		ParameterizedType type = (ParameterizedType) this.getClass().getGenericSuperclass();
		clazz = (Class<T>) type.getActualTypeArguments()[0];
	}
	public void saveEntity(T t) {
		sf.getCurrentSession().save(t);
	}
	public void updateEntity(T t) {
		sf.getCurrentSession().update(t);
	}
	public void saveOrUpdateEntity(T t) {
		sf.getCurrentSession().saveOrUpdate(t);
	}
	public void deleteEntity(T t) {
		sf.getCurrentSession().delete(t);
	}
	//批量更新
	public void batchEntityByHQL(String hql, Object... objects) {
		Query q = sf.getCurrentSession().createQuery(hql);
		for(int i = 0 ; i < objects.length ; i ++){
			q.setParameter(i, objects[i]);
		}
		q.executeUpdate();
	}
	public T getEntity(Integer id) {
		return (T) sf.getCurrentSession().get(clazz, id);
	}
	public T loadEntity(Integer id) {
		return (T) sf.getCurrentSession().load(clazz, id);
	}
	public Collection<T> findEntityByHQL(String hql, Object... objects) {
		Query q = sf.getCurrentSession().createQuery(hql);
		for(int i = 0 ; i < objects.length ; i ++){
			q.setParameter(i, objects[i]);
		}
		return q.list();
	}
}


其余的dao只要继承此类便可。 编码


另外推荐两篇文章: spa

        Java泛型简明教程

        Java 理论和实践: 了解泛型

相关文章
相关标签/搜索