三层架构(Controller-Service-DAO)模式中的controller 和 dao/mapper的通俗理解

如果把 Web 应用比作一家餐厅,它们的分工如下:

1. Controller(控制器层):餐厅的"迎宾员/点餐员"

  • 职责 :它是程序的入口。Web 项目接收到的所有请求(如点击了一个按钮、提交了一个表单)都会首先到达这里。
  • 作用
    • 接收请求:解析用户传来的参数(比如 ID 是多少)。
    • 拦截与校验:检查参数是否合法。
    • 调度响应 :调用相应的 service 层来处理业务,拿到结果后,决定返回给用户什么样的界面或 JSON 数据。
  • 核心准则Controller 自己不要写业务逻辑! 它只负责"传话"和"分发"。

2. DAO/Mapper(数据访问层):餐厅的"库房管理员"

  • 名词解释DAOData Access Object 的缩写;在 MyBatis 等框架中,习惯叫 Mapper
  • 职责 :它是代码与数据库之间的直接沟通桥梁。
  • 作用
    • 执行 SQL:增、删、改、查(CRUD)。
    • 屏蔽底层service 层不需要知道数据库是用 MySQL 还是 Oracle,也不需要写复杂的 SQL 语句,只需要调用 mapper.selectById(id) 这样的简单方法。
  • 核心准则Mapper 只做一件事------把对象存入数据库,或从数据库取出对象。

它们是如何协作的?(以"查询用户信息"为例)

当你访问一个"查询用户详情"的网页时,数据流向是这样的:

  1. 用户 :点击链接 http://api.myapp.com/user/1
  2. Controller :接收到请求,解析出 ID 为 1。对 service 说:"帮我查一下 ID 为 1 的用户。"
  3. Service :调用 mapper 说:"根据 ID 给我在数据库里捞出这个用户的数据。"
  4. DAO/Mapper :执行 SQL SELECT * FROM user WHERE id = 1,将结果包装成一个 User 对象(domain 类)返回给 service
  5. Service :可能还会对这个对象做一些业务判断(比如该用户是否被封禁),然后传回给 controller
  6. Controller:把拿到的对象转成 JSON 返回给浏览器。

为什么这样做?

这种分层开发有三个巨大的优势:

  • 分而治之 :当你觉得查询速度慢时,你肯定去优化 mapper(SQL 语句);当你觉得业务规则改了,去优化 service;当你觉得网页接口地址改了,去优化 controller你不需要去改动不相关的代码。
  • 解耦 :如果以后数据库要从 MySQL 换成 MongoDB,你只需要修改 mapper 实现,controllerservice 的代码完全不需要动。
  • 多人协作:一个人写界面和 Controller(前端向),一个人写业务逻辑(Service),一个人写复杂的 SQL 操作(DBA/后端)。大家各司其职,互不干扰。

总结:

  • Controller:指挥官(接收请求)。
  • Service:大脑(处理逻辑)。
  • Domain:数据模板(定义对象)。
  • DAO/Mapper:搬运工(跟数据库打交道)。
  • Util:工具箱(提供方便的辅助工具)。

这套结构是 Java 领域最流行的"标准模板"。理解了它们,你就掌握了后端开发的核心流程!

相关推荐
神明不懂浪漫10 小时前
【第五章】Java中的继承与多态
java·开发语言
AI多Agent协作实战派12 小时前
AI多Agent协作系统实战(十七):凌晨4点,我的AI系统在“假装工作“——3个bug同时爆炸的5小时
java·前端·bug
gaolei_eit12 小时前
Java+Ai+vue
java·spring·maven
qq_25183645712 小时前
基于java Web 动漫视频网站毕业论文
java·开发语言·前端
LayZhangStrive12 小时前
JUC相关的函数、注解、变量杂记
java·面试·多线程·juc
未秃头的程序猿13 小时前
给公司做了个AI客服Agent,用的Spring AI 1.0,3天上线领导拍板了
java·后端·ai编程
曹牧13 小时前
Eclipse 批量文本替换
java·ide·eclipse
程序员清风13 小时前
OpenAI官方发布最新提示词技巧!
java·后端·面试
一只枫林13 小时前
MySQL内、外连接知识点汇总
java·前端·数据库
梅头脑13 小时前
写了3年CRUD,volatile和synchronized的区别还是答不清——直到我画出了这张三性两锁边界图
java