Java 开发中 8 种常用数据对象(DTO/VO/PO/BO/DO/TO/POJO/DAO)的定义
·
一、核心对象详解(含示例)
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 |
三、典型业务流程示例(对象协作)
以“用户登录并查询信息”为例,各对象协作流程:
- 前端发送登录请求 → Controller 用
UserLoginDTO接收参数; - 业务层通过
UserDAO(依赖UserPO)查询数据库,验证账号密码; - 验证通过后,业务层用
UserBO封装用户数据及权限校验逻辑; - 后端将
UserBO转换为UserVO(隐藏密码、格式化日期),返回给前端。
更多推荐


所有评论(0)