• JavaEE笔记——BaseDao的使用


    在Hibernate框架中使用BaseDao主要的作用是减少冗余代码,在对Dao的操作中CRUD可以说是最普通最常见的操作了,基本上面对不同的数据表都会有类似的CRUD操作,BaseDao的思想就是把这些冗余的操作抽取出来,所以不需要在spring框架的applicationContext.xml中注册,这可能是与其他Dao不同之处。作为一个抽象出来的类,使用这个BaseDao可以使我们的代码更优雅

    第一步:和普通Dao一样,先创建个接口

    接口中实现的方法有add(添加),update(更新),delete(删除),findOne(根据id查询),findAll(查询所有)。其实,可以不局限于这几个方法,只要是Dao中都有的操作,都可以抽取进去,这里只进行基本方法的抽取,这里使用泛型,T代表所有类型。

    import java.util.List;
    
    public interface BaseDao<T> {
        
        public void add(T t);
        
        public void update(T t);
        
        public void delete(T t);
        
        public T findOne(int id);
        
        public List<T> findAll();
    
    }

    第二步:实现这个接口,写方法的具体逻辑

    这个类还要继承HibernateDaoSupport,这样在具体的Dao类中就可以不继承HibernateDaoSupport,只要继承于我们编写BaseDaoImpl就行了。BaseDaoImpl类使用了反射和泛型。

    import java.lang.reflect.ParameterizedType;
    import java.lang.reflect.Type;
    import java.util.List;
    
    import org.springframework.orm.hibernate5.support.HibernateDaoSupport;
    
    import cn.lynu.dao.BaseDao;
    
    public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T> {
        private Class pClass;
    
        public BaseDaoImpl() {
            //第一步,得到当前运行类的class
            Class clazz = this.getClass();
            //第二步,得到运行类的父类的参数化类型
            Type type = clazz.getGenericSuperclass();
            ParameterizedType pType=(ParameterizedType) type;
            //第三步,得到实际类型参数
            Type[] types = pType.getActualTypeArguments();
            Class tClass= (Class) types[0];
            this.pClass=tClass;
        }
    
        //添加
        public void add(T t) {
            this.getHibernateTemplate().save(t);
        }
    
        //更新
        public void update(T t) {
            this.getHibernateTemplate().update(t);
        }
    
        //删除
        public void delete(T t) {
            this.getHibernateTemplate().delete(t);
        }
    
        //根据Id查询
        public T findOne(int id) {
            return (T) this.getHibernateTemplate().get(pClass, id);
        }
    
        //查询所有(使用getSimpleName得到简称类名,否则,将会使用类的全路径从而出错)
        public List<T> findAll() {
            return (List<T>) this.getHibernateTemplate().find("from "+pClass.getSimpleName());         
        }
    
    }

    第三步:把所有Dao接口继承于BaseDao,所有的Dao实现类继承于BasedaoImpl

    看这个Dao接口的实现(别忘了泛型):

    再看DaoImpl类的实现(不用继承HibernateDaoSupport):

    注意:这样我们就不用在UserDao中再写CRUD和findOne,findAll方法了,但是,我们在使用这些方法时的名称就是固定的了,不要用错

  • 相关阅读:
    Scrapy学习篇(九)之文件与图片下载
    Scrapy学习篇(八)之settings
    SQL拾遗
    SQL命令导入导出
    Spring Security构建Rest服务-1401-权限表达式
    Spring Security构建Rest服务-1400-授权
    Spring Security构建Rest服务-1300-Spring Security OAuth开发APP认证框架之JWT实现单点登录
    Spring Security构建Rest服务-1205-Spring Security OAuth开发APP认证框架之Token处理
    Spring Security构建Rest服务-1204-Spring Security OAuth开发APP认证框架之Token处理
    Spring Security构建Rest服务-1203-Spring Security OAuth开发APP认证框架之短信验证码登录
  • 原文地址:https://www.cnblogs.com/lz2017/p/6711169.html
Copyright © 2020-2023  润新知