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)。


五、完整流程串起来(加上前端)

以“用户查询图书列表”为例,看看一个请求到底经历了什么:

  1. 前端(浏览器/App):发起 GET /api/books 请求。
  2. 表现层(Controller)BookController 收到请求,发现不需要参数,直接调用 bookService.findAll()
  3. 业务层(Service)BookServiceImpl 收到调用,可能会做一些业务判断(比如“有没有权限查看”),然后调用 bookMapper.selectList(...)
  4. 数据层(Mapper/Dao)BookMapper 通过 MyBatis 生成 SQL,去连接数据库。
  5. DB(MySQL):执行 SELECT * FROM book,返回结果集。
  6. 返回路径
    • Mapper 把数据库结果封装成 Book 实体。
    • Service 拿到 List<Book>,可能再加工一下,返回给 Controller。
    • Controller 拿到 List<Book>,Spring MVC 自动把它转换成 JSON 格式,返回给前端。
  7. 前端:收到 JSON 数组,渲染成列表页面。

注意:在这个流程里,Entity(实体) 一直在传递。从数据库查出来是 Entity,Service 处理的是 Entity,Controller 返回的也是 Entity(或者被序列化成 JSON 的 Entity)。


六、补充:新手最容易踩的坑——Entity 的滥用

老师教的是“用 Entity 传递”,这在简单项目里没问题。但在真实企业项目里,你可能会看到这些名词:

名词全称用途
Entity / PO实体 / 持久化对象对应数据库表,只在 Mapper 和 Service 之间传递
DTO数据传输对象前端传过来的参数,比如 BookAddDTO
VO视图对象返回给前端的展示数据,比如 BookVO
BO业务对象在 Service 内部流转的业务数据

为什么要分这么细? 因为数据库表里的字段(比如 is_deletedcreate_timepassword)不能直接暴露给前端。如果直接用 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 是“最终存放地”。 这样就不晕了。