Java 分层架构中各代码层级的关系

在分层架构中,Service、Controller、Mapper(有时也称为 DAO 或 Repository)、PO(Persistence Object)、DTO(Data Transfer Object)、VO(View Object)等概念扮演着不同的角色。下面详细介绍它们之间的关系及其用途。

1. Service 层

  • 职责:实现业务逻辑,包括计算、验证、事务处理等。
  • 作用:作为业务处理的核心层,它不直接与 UI 交互,也不直接访问数据库,而是通过调用 Mapper 层来操作数据。
  • 示例:用户登录认证、订单创建等业务逻辑处理。

2. Controller 层

  • 职责:接收客户端请求,调用 Service 层处理后返回响应。
  • 作用:作为应用程序的入口点,负责控制流程并处理 HTTP 请求和响应。
  • 示例:处理 HTTP GET/POST 请求,调用 Service 层进行处理,然后将结果返回给客户端。

3. Mapper (DAO/Repository) 层

  • 职责:负责数据持久化操作,即与数据库的交互。
  • 作用:实现数据的增删改查等操作,提供给 Service 层使用。
  • 示例:插入一条新记录到数据库、查询一条记录等。

4. PO (Persistence Object)

  • 定义:用于表示持久层对象,通常是与数据库表结构对应的实体类。
  • 作用:封装了与数据库表列相对应的属性,主要用于 Mapper 层与数据库交互时使用。
  • 示例:UserPO、OrderPO 等。

5. DTO (Data Transfer Object)

  • 定义:用于系统间传输数据的对象,通常用于远程服务调用或不同组件之间传输数据。
  • 作用:简化数据传输过程,避免直接暴露内部数据结构。
  • 示例:LoginResponseDTO、OrderSummaryDTO 等。

6. VO (View Object)

  • 定义:用于展示层的对象,通常用于展示特定视图中的数据。
  • 作用:根据展示需求对数据进行加工处理,便于前端展示。
  • 示例:UserVO、ProductDetailVO 等。

7. 关系总结

  • Controller → Service:Controller 接收到客户端请求后,调用 Service 层进行业务逻辑处理。
  • Service → Mapper:Service 层处理完业务逻辑后,需要通过 Mapper 层与数据库交互。
  • Mapper ↔ PO:Mapper 层使用 PO 对象与数据库进行交互,PO 对象与数据库表结构一一对应。
  • Service ↔ DTO/VO:Service 层可能会使用 DTO 对象进行数据传输,或者使用 VO 对象向 Controller 返回展示数据。
  • Controller ↔ VO:Controller 层接收 Service 层返回的 VO 对象,然后将这些数据组织成合适的格式返回给客户端。

8. 示例说明

假设有一个用户登录的功能:

  1. 用户提交用户名和密码给 Controller。
  2. Controller 调用 Service 层验证登录信息。
  3. Service 层调用 Mapper 层查询数据库,验证用户名和密码是否匹配。
  4. 如果匹配,则 Service 层构建一个包含用户信息的 LoginResponseDTO。
  5. Controller 接收 LoginResponseDTO,将其转换为适合客户端展示的格式(例如 JSON),并返回给客户端。

9. 前后端数据交互流程

  1. 前端向后端发送请求:前端通过 HTTP 请求(如 POST 请求)向后端发送数据。
  2. Controller 层接收请求:后端的 Controller 层接收到前端发送的请求,负责解析请求中的数据,并将这些数据封装进一个 DTO 中。
  3. Controller 层调用 Service 层:Controller 层将封装好的 DTO 对象传递给 Service 层。
  4. Service 层处理业务逻辑:Service 层负责执行具体的业务逻辑,如验证数据、计算等。Service 层可能会进一步将 DTO 转换为 PO 对象,以便与数据库进行交互。
  5. Service 层调用 Mapper 层:Service 层调用 Mapper 层(或称为 DAO/Repository 层)进行数据的持久化操作。Mapper 层使用 PO 对象与数据库进行交互,执行数据库操作(如插入、更新等)。
  6. Mapper 层返回结果给 Service 层:Mapper 层完成数据库操作后,会将结果返回给 Service 层。如果需要,Mapper 层也可以返回一个新的 PO 对象,该对象可能包含一些新的状态信息。
  7. Service 层处理返回的结果:Service 层处理 Mapper 层返回的结果,并根据需要构建一个 VO 或 DTO 对象,用于返回给 Controller 层。
  8. Service 层返回给 Controller 层:Service 层将处理后的 VO 或 DTO 对象返回给 Controller 层。
  9. Controller 层处理返回的数据:Controller 层接收 Service 层返回的数据,并将其转换为适合前端展示的格式(如 JSON),然后将数据通过 HTTP 响应返回给前端。

10. 流程总结

  1. 前端 → Controller 层
  2. Controller 层 → DTO(封装前端数据)
  3. DTO → Service 层
  4. Service 层 → PO(用于 Mapper 层)
  5. PO → Mapper 层(与数据库交互)
  6. Mapper 层 → PO/VO(结果)
  7. PO/VO → Service 层
  8. Service 层 → VO/DTO(处理后的数据)
  9. VO/DTO → Controller 层
  10. Controller 层 → 前端

请注意,实际应用中可能还会有一些额外的步骤,如异常处理、日志记录等,但上述流程是基本的工作流程。