前言

一套接近大厂的后端对象分层设计(非常实用),你理解之后,代码结构会立刻提升一个档次。


一、先给你整体结构(核心模型🔥)

一个标准后端(以电商为例):

Controller  →  Service  →  Domain/BO  →  DAO  →  DB
        ↑
       DTO / VO

二、各层职责 + 对象类型

1️⃣ Controller 层(接口层)

👉 只做两件事:

  • 接收请求(DTO)
  • 返回结果(VO)

示例:

@PostMapping("/create")
public OrderVO create(@RequestBody OrderCreateDTO dto) {
    return orderService.createOrder(dto);
}

2️⃣ DTO(入参对象)

👉 前端传给后端的数据

public class OrderCreateDTO {
    private Long userId;
    private List<ItemDTO> items;
}

特点:

  • 只负责接收数据
  • 不写业务逻辑

3️⃣ VO(返回对象)

👉 返回给前端的数据

public class OrderVO {
    private Long orderId;
    private BigDecimal amount;
}

特点:

  • 可以裁剪字段
  • 不暴露敏感信息

4️⃣ Service 层(业务层🔥)

👉 核心逻辑都在这里

public OrderVO createOrder(OrderCreateDTO dto) {
    // 校验
    // 计算价格
    // 调用库存
    // 生成订单
}

5️⃣ BO(Business Object,很多人不会用)

👉 业务内部使用的对象

public class OrderBO {
    private Long userId;
    private BigDecimal totalPrice;
}

作用:

👉 把 DTO 转成“业务模型”


6️⃣ DO / Entity(数据库对象)

👉 对应数据库表

public class OrderDO {
    private Long id;
    private Long userId;
    private BigDecimal amount;
    private Date createTime;
}

7️⃣ DAO(数据访问层)

@Mapper
public interface OrderMapper {
    void insert(OrderDO order);
}

三、完整调用链(非常重要🔥)

前端请求
   ↓
OrderCreateDTO
   ↓
Controller
   ↓
Service
   ↓
DTO → BO(转换)
   ↓
BO → DO(转换)
   ↓
DAO
   ↓
数据库
   ↓
DO → BO → VO
   ↓
返回前端

四、为什么要分这么多层?(本质🔥)

不是为了“好看”,而是解决 3 个问题:


✅ 1. 解耦(最重要)

前端变化 ≠ 数据库变化

✅ 2. 安全

password / 内部字段 不暴露

✅ 3. 灵活扩展

一个 DO → 多种 VO

五、很多人写错的地方(你要避免❌)


❌ 1. Controller 直接用 DO

public OrderDO create(OrderDO order) {}

👉 问题:

  • 暴露数据库结构
  • 后期改表就炸

❌ 2. DTO = DO(偷懒)

👉 小项目可以,大项目会崩


❌ 3. Service 返回 DO

👉 破坏分层


❌ 4. 没有转换层

👉 后期维护地狱


六、正确做法(推荐🔥)

👉 一定要有转换:

DTO ↔ BO ↔ DO ↔ VO

可以用工具:

  • MapStruct(推荐🔥)
  • BeanUtils(简单但慢)

七、命名规范(非常关键)

DTO

OrderCreateDTO
OrderUpdateDTO
OrderQueryDTO

VO

OrderVO
OrderDetailVO
OrderListVO

DO

OrderDO
UserDO

BO(可选)

OrderBO

八、一个真实电商例子(你体会一下🔥)


下单流程

1. 前端传:

{
  "userId": 1,
  "items": [...]
}

2. DTO:

OrderCreateDTO

3. Service:

校验库存
计算金额
生成订单号

4. DO:

OrderDO → insert DB

5. 返回:

OrderVO

九、进阶:什么时候可以“简化”?(现实建议)


小项目:

DTO ≈ VO ≈ DO

👉 可以合并


中大型系统:

必须分层

十、一句话总结(建议记住)

👉
DTO 负责接收数据,VO 负责返回数据,DO 负责数据库映射,BO 负责业务逻辑承载,通过分层实现解耦、可维护和安全。


十一、你现在已经到这个层级了:

理解了:

  • Spring Bean
  • IOC / AOP
  • 自动配置
  • 分层设计
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐