火星科技网您的位置:首页 >综合百科 >

Dao 层到底是做什么的 数据访问层详解

导读 Dao 层全称 Data Access Object,中文叫做数据访问层,它在分层开发架构里面专门负责和数据库打交道,把所有数据库增删改查相关操作统

Dao 层全称 Data Access Object,中文叫做数据访问层,它在分层开发架构里面专门负责和数据库打交道,把所有数据库增删改查相关操作统一封装在这里,业务层也就是 Service 层不需要直接写 SQL 语句,只需要调用 Dao 层提供的方法,就能完成数据读取和写入,Dao 层核心价值就是隔离业务逻辑和数据库细节,让代码分层清晰,后期如果更换数据库或者修改 SQL,只需要改动 Dao 层,不会影响上层业务代码,这也是项目分层设计最核心的设计思想,不管是 JavaSSM SpringBoot 这类 Java 项目,还是其他语言的分层项目,Dao 层都是标准分层里必不可少的一层,新手经常会把业务代码写进 Dao 层,或者把 SQL 直接写在 Controller 里面,这两种写法都会破坏分层规范,理解 Dao 层定位之后,就能明白每一层职责边界,知道哪些代码应该放在 Dao,哪些代码必须放到 Service。之所以单独抽出 Dao 层,是因为早期项目所有 SQL 混在业务代码里面,数据库相关代码散落在各个文件,一旦数据库类型从 MySQL 换成其他数据库,就要全项目搜索修改 SQL,维护成本非常高,分层设计把数据库访问单独抽成 Dao 层,所有数据库操作集中管理,实现解耦,同时 Dao 层一般会定义接口,再写对应的实现类,上层只依赖接口,不依赖具体实现,符合面向接口编程思想,方便单元测试,还可以 mock 模拟 Dao 层数据,不用启动真实数据库就能测试业务逻辑。

分层职责对照表

层级名称核心职责是否直接操作数据库
Controller控制层接收请求 参数校验 响应返回否
Service业务层编写业务逻辑 事务控制 流程编排否
Dao数据访问层封装 SQL 执行数据库增删改查是
Entity实体层定义数据库表对应的 Java 对象否

Dao 层开发完整步骤

第一步 定义实体类,实体类属性和数据库表字段一一对应,用来承接查询出来的数据,Dao 层方法返回值就是这个实体对象或者集合

第二步 创建 Dao 接口,接口里面声明方法,比如根据 id 查询 根据条件新增 删除 更新,只定义方法名参数和返回值,不写具体实现

第三步 编写 Dao 实现类,在实现类里面编写 SQL 语句,可以使用原生 JDBC MyBatis JPA 等技术,把 SQL 执行结果封装成实体对象返回给上层

第四步 Service 层注入 Dao 接口,在业务方法里面调用 Dao 层方法,拿到数据库数据之后,继续处理业务判断计算等逻辑

第五步 统一维护,后续如果 SQL 优化 字段调整 数据库切换,只修改 Dao 实现类,上层 Service 不需要改动

深度拓展要点

Dao 层常见实现方式

MyBatis 方式,Dao 接口搭配 Mapper XML 或者注解 SQL,是国内 SpringBoot 项目最主流方案,此时 Mapper 本质就是 Dao 层

JPA 方式,继承 JpaRepository,框架自动生成基础增删改查方法,自定义复杂查询再写 JPQL

原生 JDBC 方式,手动编写连接执行 SQL,现在很少在正式项目使用,一般用于学习底层原理

Dao 层边界禁忌

Dao 层只做数据存取,不要写复杂业务判断 计算 分支逻辑,比如订单状态判断 库存扣减规则这类业务代码,属于 Service 层职责

Dao 层一般不负责事务,事务通常放在 Service 层统一控制,因为一个业务操作可能调用多个 Dao 方法,需要保证多表操作同时成功或者同时失败

Dao 层优势清单

数据库细节封装,上层业务不用关心 SQL 细节

代码复用,多个 Service 可以共用同一个 Dao 查询方法

便于维护和 SQL 优化,所有 SQL 集中,调优的时候可以快速定位

支持单元测试,mock Dao 之后可以独立测试 Service 业务逻辑

【常见问题】

问题 1 Dao 层和 Service 层最大区别是什么

回答 1 Dao 层专门负责数据库增删改查,直接和数据库交互,Service 层负责业务逻辑编排,不直接操作数据库,Dao 层提供数据,Service 层调用 Dao 层的数据完成业务处理,二者职责不能混淆。

问题 2 Dao 层里面能不能写业务判断代码

回答 1 Dao 层不建议写业务判断代码,Dao 层定位只做数据访问,复杂业务规则应当放到 Service 层,如果把业务判断写进 Dao 层,会造成分层混乱,后期维护困难。

问题 3 MyBatis 的 Mapper 是不是就是 Dao 层

回答 1 MyBatis 里面的 Mapper 本质就是 Dao 层,Mapper 接口承担 Dao 接口的作用,SQL 写在 Mapper 对应的 XML 或者注解里,完成数据库访问,符合 Dao 层数据访问对象的设计定义。

问题 4 Dao 层为什么要使用接口设计

回答 1 Dao 层使用接口设计是为了面向接口编程,上层 Service 只依赖 Dao 接口,不绑定具体实现,方便更换底层数据库实现,也可以 mock Dao 层对象做单元测试,提升项目扩展性。

【免责申明】

本文为软件分层架构 Dao 层技术科普,不同开发框架和团队编码规范会存在差异,相关内容仅用于学习参考,不代表唯一标准实现方案,实际项目开发请遵循团队架构规范。