OA中BaseDao抽象设计思路梳理

来源:互联网 发布:php 接口文档管理系统 编辑:程序博客网 时间:2024/05/16 12:14
最近在做OA时,发现BaseDao的设计怎么这么眼熟呢?原来是ITOO中的思路。可是之前只是看,没有落实到行动上去真正的分析为什么以及实现的思路,希望现在还不晚!

抽象公共接口IBaseDao

首先我们在开发一个新的系统时,里面包含的不止一个功能,而且每一个细分的功能都会涉及到增、删、改、查这些最基本的操作。如果每一个业务逻辑Dao层的接口中都要写一遍这样的接口,这样做会造成大量代码冗余,很是苦了程序员们。所以,我们决定把这些常用的公共的方法抽象出一个公共的接口,BaseDao让每一个业务Dao类去实现这个接口。如图:

这里写图片描述

但是问题来了:每一个业务Dao的实现类中除了实体不同外,实现还是相同的。我们要做的是把这些公共的实现也省去,直接可以调用BaseDao中的方法就可以满足每一个业务逻辑Dao的需求。

BaseDao抽象类产生

于是,我们新建一个继承自IBaseDao的实现类,利用泛型来进行实现公共方法的逻辑。同时,我们让各业务Dao类来继承BaseDao.这样我们在写业务Dao类时就可以直接重复利用BaseDao的实现类了,不用再重复去写多余的代码了!机构图如下:

这里写图片描述

利用泛型抽象BaseDao代码实现

@SuppressWarnings("unchecked")public abstract class BaseDaoImpl<T> implements BaseDao<T> {    @Resource    private SessionFactory sessionFactory; //注入sessionfactory    private Class<T> clazz; //最主要的是要解决这个代表具体类的class对象的问题    public BaseDaoImpl(){        //使用反射技术得到T的真实类型        ParameterizedType pt=(ParameterizedType) this.getClass().getGenericSuperclass(); //获取实例化的真正的子类类型        this.clazz=(Class<T>) pt.getActualTypeArguments()[0];//获取第一个类型参数的真实类型    }    //获取session,子类可用    protected Session getSession(){        return sessionFactory.getCurrentSession();    }    //保存    public void save(T entity) {        Session session=getSession();        session.save(entity);    }    //根据id删除实体    public void delete(Long id) {        Object obj=getById(id);        if(obj !=null){            getSession().delete(obj);        }    }    //修改,更新    public void update(T entity) {        getSession().update(entity);    }    //通过id查询实体    public T getById(Long id) {        return (T)getSession().get(clazz, id);    }    //通过id数组查询多条记录    public List<T> getByIds(Long ids) {        return getSession().createQuery //                ("FROM "+clazz.getSimpleName()+" where id in (:ids)") //                .setParameter(":ids", ids)                .list();    }    //查询所有实体信息    public List<T> findAll() {        return getSession().createQuery("FROM "+clazz.getSimpleName()).list();    }}
查看整个代码的实现,我们发现,最重要的是clazz的实现,在具体的逻辑Dao中,代表User.class或者Role.class,但是由于这里用到的是泛型。java中又没有直接对T.class的支持,所以,我们想定义一个Class<T>来表示泛型的class对象。这样通过ParameterizedType 类的参数化类型来获取每一个真实的实体类。

小结

以上是BaseDao设计的思路,会发现,每一个设计都是遵循着设计模式的六大原则来设计的,最重要的还是抽象,通过不断的进行抽象,是的程序实现变得简单,归根结底还是开发人员太“懒”了。只有怕累,才会有更简便的方法!
1 0
原创粉丝点击