03持久层的代码抽取:IBaseDao&BaseDaoImpl

BaseDao以及BaseDaoImpl的设计

03持久层的代码抽取:IBaseDao&BaseDaoImpl_第1张图片

IBaseDao

package com.itheima.dao.base;

import java.io.Serializable;
import java.util.List;

/**
 * 持久层通用接口
 * @author Administrator
 *
 * @param 
 */
public interface IBaseDao
{
      public void save(T entity);
      public void delete(T entity);
      public void update(T entity);
      public T findById(Serializable id);
      public List 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 extends HibernateDaoSupport implements IBaseDao
{
    //代表的是实体类的类型
    private Class 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)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 findAll() {
        //FROM后面一定要留一个空格,否则会出现连读的情况,比如:FROMUESR
        String hql="FROM "+ entityClass.getSimpleName();
        return (List) this.getHibernateTemplate().find(hql);
    }


}

---->>@Resource
可以根据对象的名称注入,也可以根据对象的类型注入.
既可以放在属性上,也可以放在方法上.
顶级接口Type的认识

03持久层的代码抽取:IBaseDao&BaseDaoImpl_第2张图片

你可能感兴趣的:(03持久层的代码抽取:IBaseDao&BaseDaoImpl)