一、核心对象详解(含示例)

1. DTO(Data Transfer Object):数据传输对象
  • 用途:前后端/独立服务间的数据传输,接收前端请求参数。
  • 核心特征:纯数据容器,无业务逻辑,字段按需裁剪。
  • 代码示例
    // 前端登录请求DTO(仅包含必要参数)
    public class UserLoginDTO {
        private String username;
        private String password;
        // getter/setter
    }
    
    // Controller接收请求
    @RestController
    public class UserController {
        @PostMapping("/login")
        public String login(@RequestBody UserLoginDTO loginDTO) {
            System.out.println("用户名:" + loginDTO.getUsername());
            return "登录请求接收成功";
        }
    }
    
2. VO(View Object):视图对象
  • 用途:后端返回前端的响应数据封装,仅包含页面所需字段。
  • 核心特征:可格式化数据(如日期转字符串),屏蔽敏感字段。
  • 代码示例
    // 后端返回前端的用户信息VO(隐藏密码等敏感字段)
    public class UserVO {
        private String username;
        private String nickname;
        private String registerTime; // 格式化后的日期字符串
        // getter/setter
    }
    
    // Controller返回响应
    @GetMapping("/user/info")
    public UserVO getUserInfo() {
        UserPO userPO = userDAO.selectById(1L);
        UserVO userVO = new UserVO();
        userVO.setUsername(userPO.getUsername());
        userVO.setNickname(userPO.getNickname());
        userVO.setRegisterTime(new SimpleDateFormat("yyyy-MM-dd").format(userPO.getRegisterTime()));
        return userVO;
    }
    
3. PO(Persistent Object):持久对象
  • 用途:映射数据库表结构,与数据表字段一一对应。
  • 核心特征:字段与表字段完全匹配,仅用于数据持久化(增删改查)。
  • 代码示例
    // 对应数据库user表(表字段:username/password/status/register_time)
    public class UserPO {
        private String username;
        private String password;
        private Integer status;
        private Date registerTime;
        // getter/setter
    }
    
4. BO(Business Object):业务对象
  • 用途:封装业务逻辑,可组合多个 PO 完成复杂业务。
  • 核心特征:包含业务方法,对内提供服务,字段可能多于 DTO。
  • 代码示例
    // 简历BO(组合教育经历、工作经历两个PO)
    public class ResumeBO {
        private EducationPO educationPO; // 教育经历PO
        private WorkPO workPO;           // 工作经历PO
    
        // 业务方法:计算工作年限
        public int calculateWorkYears() {
            Date startDate = workPO.getStartDate();
            return ChronoUnit.YEARS.between(LocalDate.from(startDate.toInstant()), LocalDate.now());
        }
        // getter/setter
    }
    
5. DO(Domain Object):领域对象
  • 用途:抽象现实业务实体,等同于 PO 或 BO。
  • 核心特征:可映射表结构(如 PO),也可封装业务逻辑(如 BO),无严格边界。
  • 代码示例
    // 商品领域对象(既映射表结构,又包含简单业务逻辑)
    public class ProductDO {
        private Long id;
        private String name;
        private BigDecimal price;
        private Integer stock;
    
        // 业务方法:扣减库存
        public boolean deductStock(int num) {
            if (this.stock >= num) {
                this.stock -= num;
                return true;
            }
            return false;
        }
        // getter/setter
    }
    
6. TO(Transfer Object):跨应用传输对象
  • 用途:微服务间(对内)的数据传输(如 OpenFeign 调用)。
  • 核心特征:区别于 DTO(对外),仅用于内部服务通信。
  • 代码示例
    // 订单服务向支付服务传输的TO
    public class OrderPayTO {
        private Long orderId;
        private BigDecimal amount;
        private String payType;
        // getter/setter
    }
    
    // 支付服务Feign接口
    @FeignClient("pay-service")
    public interface PayFeignClient {
        @PostMapping("/pay/process")
        String processPay(@RequestBody OrderPayTO orderPayTO);
    }
    
7. POJO(Plain Ordinary Java Object):简单Java对象
  • 用途:所有简单Java Bean的统称,无特殊规则。
  • 核心特征:仅包含字段、getter/setter,无继承特殊类、无实现特殊接口。
  • 代码示例
    // 标准POJO(无任何特殊依赖)
    public class SimplePOJO {
        private String name;
        private Integer age;
        // getter/setter
    }
    
8. DAO(Data Access Object):数据访问对象
  • 用途:封装数据库操作,为业务层提供数据访问接口。
  • 核心特征:包含 CRUD 方法,依赖 PO 操作数据库。
  • 代码示例
    // UserDAO(MyBatis-Plus示例)
    public interface UserDAO extends BaseMapper<UserPO> {
        // 自定义查询方法
        UserPO selectByUsername(String username);
    }
    
    // 业务层调用
    @Service
    public class UserService {
        @Autowired
        private UserDAO userDAO;
    
        public UserPO getUserByUsername(String username) {
            return userDAO.selectByUsername(username);
        }
    }
    

二、关键区别对比

对象核心用途适用场景核心特征
DTO前后端/独立服务间传输前端请求入参对外传输,按需裁剪字段
VO后端响应前端数据前端页面展示屏蔽敏感字段,可格式化数据
PO映射数据库表数据持久化(增删改查)与表字段一一对应
BO封装业务逻辑业务层处理可组合多个PO,包含业务方法
DO抽象业务实体领域模型设计等同于PO或BO,无严格边界
TO微服务间内部传输OpenFeign调用对内传输,区别于DTO(对外)
POJO统称简单Java Bean所有纯数据容器仅字段+getter/setter
DAO数据库操作封装数据访问层提供CRUD接口,依赖PO

三、典型业务流程示例(对象协作)

以“用户登录并查询信息”为例,各对象协作流程:

  1. 前端发送登录请求 → Controller 用 UserLoginDTO 接收参数;
  2. 业务层通过 UserDAO (依赖 UserPO)查询数据库,验证账号密码;
  3. 验证通过后,业务层用 UserBO 封装用户数据及权限校验逻辑;
  4. 后端将 UserBO 转换为 UserVO(隐藏密码、格式化日期),返回给前端。
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐