PO、VO、BO、DTO、DAO、POJO,很多刚入职场的同学一开始真是被这堆缩写搞得晕头转向。其实这些概念不是背下来就行的,得结合业务逻辑去理解。下面我用通俗的方式讲清楚它们的区别和使用场景
一、PO
PO 是持久化对象,对应数据库中的一张表。可以理解成表的一行数据被“翻译”成了一个 Java 对象。它的作用主要是跟数据库直接打交道。
比如有一张 user 表:
CREATE TABLE user (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50),
age INT,
email VARCHAR(100)
);
那对应的 PO 就长这样:
public class UserPO {
private Long id;
private String username;
private Integer age;
private String email;
// getter、setter省略
}
这个类一般会出现在 entity 或者 model 包下面,用于 ORM 框架(比如 MyBatis、JPA)映射数据库表。
二、VO
VO 是视图对象,一般用于展示层,也就是返回给前端的数据。 为什么需要 VO?因为我们不可能把数据库表结构原封不动地返回给用户。
比如用户详情页只需要展示昵称和年龄,不需要邮箱,那我们就定义一个 VO:
public class UserVO {
private String username;
private Integer age;
// getter、setter省略
}
Controller 层拿到 Service 返回的数据后,会组装成 VO 返回给前端。
@GetMapping("/user/{id}")
public UserVO getUser(@PathVariable Long id) {
UserPO user = userService.getUserById(id);
UserVO vo = new UserVO();
vo.setUsername(user.getUsername());
vo.setAge(user.getAge());
return vo;
}
三、BO
BO 是业务对象,一般在 Service 层使用,它代表业务逻辑处理过程中的数据载体。 BO 往往是多个 PO 的组合,或者是经过计算、处理后的中间结果。
举个例子,比如我们要返回“用户的基本信息 + 最近登录信息”,这两个可能在不同表中:
public class UserBO {
private String username;
private Integer age;
private LocalDateTime lastLoginTime;
}
Service 层可能会这么写:
public UserBO getUserDetail(Long userId) {
UserPO user = userMapper.selectById(userId);
LoginLogPO log = loginLogMapper.findLastLogin(userId);
UserBO bo = new UserBO();
bo.setUsername(user.getUsername());
bo.setAge(user.getAge());
bo.setLastLoginTime(log.getLoginTime());
return bo;
}
四、DTO
DTO 是数据传输对象,顾名思义就是用来做数据传输的,通常出现在接口入参或者跨服务传输时。 比如前端传来的注册信息,我们不会直接用 PO 来接收(那太危险了),而是定义一个 DTO:
public class UserRegisterDTO {
private String username;
private String password;
private String email;
}
Controller 里接收请求:
@PostMapping("/register")
public void register(@RequestBody UserRegisterDTO dto) {
userService.register(dto);
}
DTO 的作用是保证输入输出的数据结构清晰,避免直接暴露数据库结构。
五、DAO
DAO 是数据访问对象,就是我们常见的数据库操作层。 它屏蔽了底层数据访问的细节,对上层只提供简单的接口。
比如:
public interface UserDAO {
UserPO selectById(Long id);
int insert(UserPO user);
}
如果用 MyBatis,还可以直接配 XML 或注解:
@Mapper
public interface UserMapper {
@Select("SELECT * FROM user WHERE id = #{id}")
UserPO findById(Long id);
}
六、POJO
POJO 是个大概念,全称普通的 Java 对象。它没有特定的约束,只是最原始的 Java Bean。 你可以把上面提到的 PO、VO、BO、DTO 都看作是 POJO 的一种。
比如这样一个最简单的类:
public class Book {
private String name;
private String author;
}
它既不是持久化对象,也不是业务对象,就是一个简单的数据容器。
|
|
|
|
|
|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
其实这些概念没有必要死记硬背,在实际项目中体会就好。你写多了项目就会发现,它们之间的“边界”不是绝对的,比如有时候 BO 和 VO 合并用、DTO 和 PO 结构相似,都没问题。关键是职责清晰、层次分明。
如果硬要一句话总结:
PO 存数据库,VO 展示页面,BO 处理业务,DTO 传输数据,DAO 操作数据库,POJO 是它们的祖宗。
——这下是不是就不糊涂了 😄
-END-
我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html
🔥东哥私藏精品🔥
东哥作为一名老码农,整理了全网最全《Java高级架构师资料合集》。总量高达650GB。点击下方公众号回复关键字java 全部免费领取

