【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
引用维基百科的定义:
泛型的定义主要有以下两种:
- 在程序编码中一些包含类型参数的类型,也就是说泛型的参数只可以代表类,不能代表个别对象。(这是当今较常见的定义)
- 在程序编码中一些包含参数的类。其参数可以代表类或对象等等。(现在人们大多把这称作模板)
泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。
泛型只不过是java中的类型而已,继承自Type接口。
泛型的意义在于:在抽象的时候泛化,在具体的时候细化,在编译的时候就可以决定泛化的值。通俗得讲,可以将泛型看做是类或者接口带了一个参数,这个参数可以在属性、方法的参数、方法的返回值中使用使用。
ParameterizedType有如下几个方法:
Type[] | getActualTypeArguments() 返回表示此类型实际类型参数的 Type 对象的数组。 |
Type | getOwnerType() 返回 Type 对象,表示此类型是其成员之一的类型。 |
Type | getRawType() 返回 Type 对象,表示声明此类型的类或接口。 |
actualTypeArguments指类的参数
rawType指带了参数的类或者接口
了解这些之后,就可以对使用了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 ;
/**
* 1、this代表该类的子类
* 2、this.getClass().getGenericSuperclass()代表该类
* 3、type.getActualTypeArguments()[0]就是T
* 4、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只要继承此类即可。
另外推荐两篇文章:
Java泛型简明教程
Java 理论和实践: 了解泛型
来源:oschina
链接:https://my.oschina.net/u/698737/blog/90778