BaseDao以及BaseDaoImpl的設(shè)計(jì)
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>
{
//代表的是實(shí)體類的類型
private Class<T> entityClass;
@Resource//根據(jù)類型注入spring工廠中的會(huì)話工廠對(duì)象sessionFactory
public void setMySessionFactory(SessionFactory sessionFactory){
super.setSessionFactory(sessionFactory);
}
//獲得父類的泛型類型
public BaseDaoImpl()
{
ParameterizedType superclass = (ParameterizedType)this.getClass().getGenericSuperclass();
//獲得父類的泛型數(shù)組
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后面一定要留一個(gè)空格,否則會(huì)出現(xiàn)連讀的情況,比如:FROMUESR
String hql="FROM "+ entityClass.getSimpleName();
return (List<T>) this.getHibernateTemplate().find(hql);
}
}
---->>@Resource
可以根據(jù)對(duì)象的名稱注入,也可以根據(jù)對(duì)象的類型注入.
既可以放在屬性上,也可以放在方法上.
頂級(jí)接口Type的認(rèn)識(shí)