大数跨境
0
0

PO、VO、BO、DTO、DAO、POJO傻傻分不清楚。。。

PO、VO、BO、DTO、DAO、POJO傻傻分不清楚。。。 Java技术图谱
2025-11-17
1

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;
}

它既不是持久化对象,也不是业务对象,就是一个简单的数据容器。

类型
全称
层次
用途
PO
Persistent Object
数据层
映射数据库表
VO
View Object
表现层
返回前端的数据
BO
Business Object
业务层
封装业务逻辑数据
DTO
Data Transfer Object
接口层
数据传输载体
DAO
Data Access Object
持久层
操作数据库
POJO
Plain Old Java Object
无特定层
普通 Java 类

其实这些概念没有必要死记硬背,在实际项目中体会就好。你写多了项目就会发现,它们之间的“边界”不是绝对的,比如有时候 BO 和 VO 合并用、DTO 和 PO 结构相似,都没问题。关键是职责清晰、层次分明

如果硬要一句话总结:

PO 存数据库,VO 展示页面,BO 处理业务,DTO 传输数据,DAO 操作数据库,POJO 是它们的祖宗。

——这下是不是就不糊涂了 😄

-END-

我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html


🔥东哥私藏精品🔥


东哥作为一名老码农,整理了全网最全《Java高级架构师资料合集》。总量高达650GB点击下方公众号回复关键字java 全部免费领取

【声明】内容源于网络
0
0
Java技术图谱
回复 java,领取Java面试题。分享AI编程,AI工具,Java教程,Java下载,Java技术栈,Java源码,Java课程,Java技术架构,Java基础教程,Java高级教程,idea教程,Java架构师,Java微服务架构。
内容 1111
粉丝 0
Java技术图谱 回复 java,领取Java面试题。分享AI编程,AI工具,Java教程,Java下载,Java技术栈,Java源码,Java课程,Java技术架构,Java基础教程,Java高级教程,idea教程,Java架构师,Java微服务架构。
总阅读1.2k
粉丝0
内容1.1k