OA中BaseDao抽象设计思路梳理

12 篇文章 0 订阅
最近在做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设计的思路,会发现,每一个设计都是遵循着设计模式的六大原则来设计的,最重要的还是抽象,通过不断的进行抽象,是的程序实现变得简单,归根结底还是开发人员太“懒”了。只有怕累,才会有更简便的方法!
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值