Java/后端
三层架构、MVC、Dao、DB 关系
很多新手学到这里都会晕:老师讲“三层架构”,网上又讲“MVC”,还有“Dao”、“Mapper”、“DB”,它们到底谁是谁?是不是一回事?
一、老师说的“三层架构”是什么?
老师说的三层,指的是后端服务的宏观分层(也叫三明治架构):
| 层 | 角色比喻 | 职责 |
|---|---|---|
| 表现层(Web / Controller) | 接待员 | 接收前端请求,校验参数,转交给业务层 |
| 业务逻辑层(Service) | 厨师 | 处理业务逻辑(如借书判断库存、下单扣积分),协调多个数据层操作 |
| 数据访问层(Dao / Mapper) | 仓库管理员 | 和数据库打交道,执行具体的增删改查 |
Entity(实体) 是在这三层之间传递的“货物”。比如前端传来一个“借书请求”,Controller 把它打包成实体,交给 Service,Service 再交给 Mapper 存入数据库。
核心链路:
前端 → Controller → Service → Mapper → 数据库
二、那 MVC 又是什么?
MVC 是一个“表现层”内部的软件设计模式,它不针对整个后端,只针对**用户界面(前端/接口)**这一块。
- M (Model):数据模型。就是我们的 Entity,或者包含业务数据的对象。
- V (View):视图。前端页面(传统项目是 JSP/HTML;前后端分离项目中,V 就是返回给前端的 JSON 数据)。
- C (Controller):控制器。接收请求,决定用哪个 Model,返回哪个 View。
关键结论:MVC 只负责“怎么把数据展示给用户”,它根本不关心“数据库怎么连”、“业务逻辑有多复杂”。
三、它们是什么关系?(套娃)
你可以这样理解:
三层架构是“公司整体”,MVC 是“前台接待部”。
具体对应关系如下:
| 三层架构(宏观) | 包含的内容 | MVC 对应关系 |
|---|---|---|
| 表现层 | Controller、MVC、参数校验、返回 JSON | 这就是 MVC 所在的地方 |
| 业务层 | Service、事务控制、业务逻辑 | 不属于 MVC,MVC 管不着 |
| 数据层 | Mapper/Dao、SQL、数据库连接 | 不属于 MVC,MVC 管不着 |
所以,MVC 只是三层架构中“表现层”的一种实现方式。 你的 Controller 既是三层架构的“表现层”,也是 MVC 的“C”。
四、Dao 和 DB 是什么?
- DB(Database):物理数据库,比如你电脑上装的 MySQL、Oracle。它是存数据的地方,是硬件/软件层面的东西。
- Dao(Data Access Object):数据访问对象。它是一个设计模式,指的是“把操作数据库的代码封装到一个接口里”。
- Mapper:在 MyBatis/MyBatis-Plus 里,Mapper 就是 Dao 的具体落地形式。
所以:Dao ≈ Mapper。 它们都是数据访问层。只是叫法不同(老项目叫 Dao,MyBatis 时代叫 Mapper)。
五、完整流程串起来(加上前端)
以“用户查询图书列表”为例,看看一个请求到底经历了什么:
- 前端(浏览器/App):发起
GET /api/books请求。 - 表现层(Controller):
BookController收到请求,发现不需要参数,直接调用bookService.findAll()。 - 业务层(Service):
BookServiceImpl收到调用,可能会做一些业务判断(比如“有没有权限查看”),然后调用bookMapper.selectList(...)。 - 数据层(Mapper/Dao):
BookMapper通过 MyBatis 生成 SQL,去连接数据库。 - DB(MySQL):执行
SELECT * FROM book,返回结果集。 - 返回路径:
- Mapper 把数据库结果封装成
Book实体。 - Service 拿到
List<Book>,可能再加工一下,返回给 Controller。 - Controller 拿到
List<Book>,Spring MVC 自动把它转换成 JSON 格式,返回给前端。
- Mapper 把数据库结果封装成
- 前端:收到 JSON 数组,渲染成列表页面。
注意:在这个流程里,Entity(实体) 一直在传递。从数据库查出来是 Entity,Service 处理的是 Entity,Controller 返回的也是 Entity(或者被序列化成 JSON 的 Entity)。
六、补充:新手最容易踩的坑——Entity 的滥用
老师教的是“用 Entity 传递”,这在简单项目里没问题。但在真实企业项目里,你可能会看到这些名词:
| 名词 | 全称 | 用途 |
|---|---|---|
| Entity / PO | 实体 / 持久化对象 | 对应数据库表,只在 Mapper 和 Service 之间传递 |
| DTO | 数据传输对象 | 前端传过来的参数,比如 BookAddDTO |
| VO | 视图对象 | 返回给前端的展示数据,比如 BookVO |
| BO | 业务对象 | 在 Service 内部流转的业务数据 |
为什么要分这么细?
因为数据库表里的字段(比如 is_deleted、create_time、password)不能直接暴露给前端。如果直接用 Entity 返回,把密码、删除标记全吐给前端了,这是安全事故。
新手建议:先用 Entity 跑通整个流程,理解了三层架构。等以后做复杂项目,再学 DTO 和 VO 的转换。
七、一句话总结
- 三层架构:后端宏观分层,分为表现层(Controller)、业务层(Service)、数据层(Dao/Mapper)。
- MVC:只属于“表现层”的设计模式,C 就是 Controller,M 是数据(Entity),V 是返回的 JSON/页面。
- Dao:数据访问对象,也就是 MyBatis 里的 Mapper。
- DB:物理数据库。
- Entity:在三层之间传递的数据载体。
把它们看成:三层架构是“公司”,MVC 是“前台”,Dao/Mapper 是“仓库”,Entity 是“货物”,DB 是“最终存放地”。 这样就不晕了。