分层架构中的DAO工程实践

目录

1、问题的背景

2、工程实践

3、总结


1、问题的背景

   在写Java面向对象程序的过程中,我们往往不知不觉中写成了面向过程式的代码,特别是我们的Service服务对象是非常复杂,并且经常因为业务变更,我们代码一直在修改,很少关注程序中的扩展性。

2、工程实践

    SpringBoot、Mybatis、Mysql技术架构背景来演示代码。本次实践,主要演示内容,将Service的职责进行分离,拆分为4个职责服务对象:增加、修改、查询、删除服务对象,然后将数据访问职责集成到DAO接口中,而DAO的实现,真正是委托给Manager层处理,而Manager则是需要委托Mapper来实现自己的职责。

package cn.vetech.center.cps.flsc.service.fc.common.service;

import cn.hutool.core.clone.Cloneable;

/**
 * CommonMsgService
 * 

遵守接口隔离原则,将原先的CommonMsgService一拆为三,CommonMsgUpdateService、CommonMsgQueryService、CommonMsgInsertService

* @author liqiao * @date 2021-12-24 09:46:27 */ public interface CommonMsgService extends CommonMsgUpdateService, CommonMsgQueryService, CommonMsgInsertService, CommonMsgDeleteService, Cloneable { }

CommonMsgQueryServiceImpl 源码,省略无关代码

/**
 * CommonMsgQueryService服务实现
 * @author LiQiao
 * @date 2022/12/28
 */
@Slf4j
@Primary
@Service
public class CommonMsgQueryServiceImpl implements CommonMsgQueryService {
    @Autowired
    private ICommonMsgDao commonMsgDao;
    @Autowired
    private ICommonMsgRetryDao commonMsgRetryDao;

}

CommonMsgDao源码,省略无关代码

/**
 * 基于DB的CommonMsg数据访问对象
 * @author  liqiao
 * @date    2021-12-24 09:46:27
 */
@Component
public class CommonMsgDao implements ICommonMsgDao {

    @Autowired
    private CommonMsgManager commonMsgManager;

    @Override
    public List query(String application, String module, String scene, String busiId) {
        return this.commonMsgManager.query(application, module, scene, busiId);
    }

}

CommonMsgManager源码,省略无关代码

/**
 * CommonMsgManager实现依赖于mybatis orm框架,对上层dao提供支持
 * @author  liqiao
 * @date    2021-12-24 09:46:27
 */
@Component
public class CommonMsgManager extends BaseServiceImpl {

    public List query(String application, String module, String scene, String busiId) {
        EntityWrapper wrapper = new EntityWrapper();
        wrapper.eq(CommonMsg.Column.APPLICATION, application);
        wrapper.eq(CommonMsg.Column.MODULE, module);
        wrapper.eq(CommonMsg.Column.SCENE, scene);
        wrapper.eq(CommonMsg.Column.BUSI_ID, busiId);
        List list = super.selectList(wrapper);
        return list;
    }
}

3、总结

    对于Service对象,我们一定要经常进行重构,至于什么时候应该重构,我们可见的现象是,
Service中方法数量是不是超过10个,一个方法代码行是不是超过80,类是不是快突破200行了,
这些都是一个信号,破坏了类的单一职责原则,这个时候,我们一定要将Service中的一个功能单元进行抽取,分离到其他Service对象中,进行职责分离;

第二,引入DAO层,目的在于解耦,因为数据访问层日后,可能进行变更,切换数据存储的实现,实现从Mysql切换为NoSql、ElasticSearch、NewSql等非RDBMS,Mybatis只是一个ORM框架,只解决关系型数据库的关系模型与对象模型的映射问题。并且,如果要将数据访问层单独部署,这个DAO层是非常有必要的。

第三,引入Mangager层,是将DAO层中涉及到多个表的CRUD操作进行组合; 
将事务下沉到Mangager层中,避免事务过长;Mangager对外部资源的访问进行转换与隔离

所以,我们总结,程序中DAO层是非常重要的,通常伴随着Manager层一起存在 。

你可能感兴趣的:(架构,java,开发语言)