BaseDao以及BaseDaoImpl的设计
IBaseDao
package com.itheima.dao.base;
import java.io.Serializable;
import java.util.List;
/**
* 持久层通用接口
* @author Administrator
*
* @param <T>
*/
public interface IBaseDao<T>
{
public void save(T entity);
public void delete(T entity);
public void update(T entity);
public T findById(Serializable id);
public List<T> findAll();
}
BaseDaoImpl
package com.itheima.dao.base.impl;
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
import javax.annotation.Resource;
import org.hibernate.SessionFactory;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;
import com.itheima.dao.base.IBaseDao;
public class BaseDaoImpl<T> extends HibernateDaoSupport implements IBaseDao<T>
{
//代表的是实体类的类型
private Class<T> entityClass;
@Resource//根据类型注入spring工厂中的会话工厂对象sessionFactory
public void setMySessionFactory(SessionFactory sessionFactory){
super.setSessionFactory(sessionFactory);
}
//获得父类的泛型类型
public BaseDaoImpl()
{
ParameterizedType superclass = (ParameterizedType)this.getClass().getGenericSuperclass();
//获得父类的泛型数组
Type[] actualTypeArguments = superclass.getActualTypeArguments();
entityClass=(Class<T>)actualTypeArguments[0];
}
public void save(T entity) {
this.getHibernateTemplate().save(entity);
}
public void delete(T entity) {
this.getHibernateTemplate().delete(entity);
}
public void update(T entity) {
this.getHibernateTemplate().update(entity);
}
public T findById(Serializable id) {
return this.getHibernateTemplate().get(entityClass, id);
}
public List<T> findAll() {
//FROM后面一定要留一个空格,否则会出现连读的情况,比如:FROMUESR
String hql="FROM "+ entityClass.getSimpleName();
return (List<T>) this.getHibernateTemplate().find(hql);
}
}
---->>@Resource
可以根据对象的名称注入,也可以根据对象的类型注入.
既可以放在属性上,也可以放在方法上.
顶级接口Type的认识