引用维基百科的定义: html
泛型的定义主要有如下两种: java
泛型的好处是在编译的时候检查类型安全,而且全部的强制转换都是自动和隐式的,提升代码的重用率。 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