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

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的认识

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,062评论 19 139
  • 1. 简介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的...
    笨鸟慢飞阅读 11,180评论 0 4
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 47,131评论 6 342
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 14,019评论 6 13
  • 第一章 被认领 “据报道,由于地震和连日的暴雨,震中心X市已经全部被淹没,成为一座死城,当救援人员赶到时只救出了一...
    繁星_星辰阅读 3,153评论 1 0

友情链接更多精彩内容