关于项目中DTO,VO,BO之间的理解分析

DTO、BO、VO的区别与应用解析

📦 1. DTO(Data Transfer Object)数据传输对象

比喻:快递包裹📦
想象你在网上购物,商家把商品打包成包裹,通过快递从仓库运到你家

  • 用途‌:服务之间传输数据的容器
  • 场景‌:
    • 微服务 A 调用微服务 B 时传递的参数
    • Controller 接收前端提交的表单数据
  • 特点‌:
    • 只包含传输所需字段(如:订单ID + 商品列表)
    • 没有业务逻辑(纯数据载体)
  • 代码示例‌:
    
    

    javaCopy Code

    // 订单创建DTO(前端 → 后端) public class OrderCreateDTO { private Long userId; private List<OrderItemDTO> items; private String deliveryAddress; // 只有getter/setter,没有业务方法 }

2. BO(Business Object)业务对象

比喻:工厂生产线⚙️
包裹到达分拣中心后,工人拆包检查、组装配件、贴标签等加工过程

  • 用途‌:封装核心业务逻辑的对象
  • 场景‌:
    • Service 层处理业务逻辑
    • 操作多个数据源的聚合
  • 特点‌:
    • 包含业务状态和行为(如:计算订单总价)
    • 可能组合多个实体对象
  • 代码示例‌:
    
    

    javaCopy Code

    // 订单业务对象 public class OrderBO { private Order order; // 订单实体 private User user; // 用户实体 private Payment payment; // 支付实体 // 业务方法:计算订单总价 public BigDecimal calculateTotal() { return order.getItems().stream() .map(item -> item.getPrice().multiply(item.getQuantity())) .reduce(BigDecimal.ZERO, BigDecimal::add); } // 业务方法:校验库存 public boolean checkInventory() { return order.getItems().stream() .allMatch(item -> stockService.hasStock(item)); } }

🖼️ 3. VO(View Object)视图对象

比喻:礼品包装🎁
工厂加工好的商品,经过精美包装后展示给顾客的样子

  • 用途‌:返回给前端的展示数据
  • 场景‌:
    • Controller 返回给前端的数据
    • 接口响应对象
  • 特点‌:
    • 按前端需求定制数据结构(如:组合多表字段)
    • 包含展示逻辑(如:日期格式化)
    • 过滤敏感数据(如:隐藏密码字段)
  • 代码示例‌:
    
    

    javaCopy Code

    // 订单详情VO(后端 → 前端) public class OrderDetailVO { private String orderNo; private String userName; // 组合用户表字段 private String formattedDate; // 格式化后的日期 private String statusLabel; // 状态转中文 private List<ProductVO> items; // 嵌套VO // 转换方法(BO → VO) public static OrderDetailVO fromBO(OrderBO bo) { OrderDetailVO vo = new OrderDetailVO(); vo.setOrderNo(bo.getOrder().getNo()); vo.setUserName(bo.getUser().getName()); vo.setFormattedDate(formatDate(bo.getOrder().getCreateTime())); // ...其他赋值逻辑 return vo; } }

🌉 完整流程示例(电商下单)


mermaidCopy Code

sequenceDiagram Frontend->>Controller: 提交订单CreateDTO Controller->>Service: 传入DTO Service->>Service: 创建OrderBO Service->>Service: bo.checkInventory() Service->>Service: bo.calculateTotal() Service->>Database: 保存数据 Service->>Controller: 返回OrderResultVO Controller->>Frontend: 返回VO数据

📊 三者的核心区别

对象生命周期包含内容典型场景
DTO跨层传输时纯数据字段接口参数接收
BO业务处理过程中数据+业务逻辑Service内部业务操作
VO数据返回时定制化展示数据接口返回给前端的数据结构

💡 关键记忆点

  1. DTO 是入口‌:像快递箱,装着原始数据进入系统
  2. BO 是车间‌:在业务层被拆解、加工、组合
  3. VO 是出口‌:像礼品盒,把最终结果美观地展示出去
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值