本文最后更新于 302 天前,如有错误请邮件至 zhiligyi222na@gmail.com

1. Controller 层(最左侧)
职责:接收 HTTP 请求 → 组装参数 → 调用 Service → 把结果封装成统一响应返回前端。
- 1. 接收并封装参数
把前端传进来的 JSON/表单里的 username、password 取出来,封装成一个 DTO(如LoginDTO)。
示例代码(Spring MVC):java复制@PostMapping("/login") public Result login(@RequestBody LoginDTO dto) { Employee emp = employeeService.login(dto.getUsername(), dto.getPassword()); return Result.success(emp); } - 2. 调用 Service 方法查询数据库
把 username、password 往下传,交给 Service 层去做真正的业务逻辑。 - 3. 封装结果并响应
Service 把校验后的 Employee 对象返回上来,Controller 把它再包一层统一返回格式(如Result<T>),然后 return 给前端。
2. Service 层(中间)
职责:业务编排、事务控制、密码校验、抛业务异常。
- 1. 调用 Mapper 查询数据库
拿到 username 后,立刻调 Mapper 层去数据库查整条记录。
示例:java复制Employee emp = employeeMapper.findByUsername(username); - 2. 密码比对
Mapper 返回的是数据库里存的加密后的密码。Service 层把前端传来的明文密码用同样的算法(如 BCrypt)加密,再与数据库值比对:java复制if (!passwordEncoder.matches(rawPassword, emp.getPassword())) { throw new BizException("用户名或密码错误"); } - 3. 返回结果
比对成功后把 Employee 对象原样返回给 Controller;失败则抛异常或返回 null/错误码,由 Controller 统一处理。
3. Mapper 层(最右侧)
职责:纯粹的 SQL 交互,只负责把数据拿出来,不做任何业务判断。
- 1.
select * from employee…
Mapper 接口和 XML/注解里只写一条 SQL:sql复制SELECT * FROM employee WHERE username = #{username}MyBatis 会把结果映射成Employee实体。 - 2. 数据库
指真正的 RDBMS(MySQL、PostgreSQL …)。SQL 发到库后返回一行记录(或空)。 - 3. 返回结果
Mapper 把结果塞到实体类里回传给 Service。
纵向看三条“1-2-3”线
- 第一条 1-2-3:Controller 的全部生命周期
- 第二条 1-2-3:Service 的全部生命周期
- 第三条 1-2-3:Mapper 的全部生命周期
这样就把一次 HTTP 请求在 Java 后端的三层结构中完整地串了起来。





