一文彻底弄懂Java中的PO、VO、BO、DO、DAO、DTO、POJO

593 阅读3分钟

我们都知道java是面向对象(object)的,在开发过程中,我们会封装各种各样的实体类,在面对PO、VO、BO等等专业术语时你会不会也分不清楚呢,今天我就来详细的解释下他们到底是什么意思以及在什么场合会用到。

ps:下面的例子中我都会以“用户(user)”这个实体类来说明。

PO持久化对象(Persistent Object)

PO是持久化对象,用于表示数据库中的实体或表的映射

通常与数据库表的结构和字段对应

PO的属性对应数据库表的字段,可以进行持久化操作(新增、查询、更新、删除)

例如:UserPO 中的属性和数据库表中的字段是一一对应的。

// 通常与数据库表对应
public class UserPO {
    private Long id;
    private String username;
    private String password;
}

VO值对象(Value Object)

VO是值对象,用于封装数据

通常是不可变的,用于传递数据而不包含业务逻辑

VO可以用于在不同层之间传递数据,如前端和后端之间,后端的返回的到前端的数据只需要保留必要的字段就可以,将这些必要的字段封装起来就是VO

例如:

// 用于展示,例如给前端的用户视图
public class UserVO {
    private String username;
    private String display_name;
}

BO业务对象(Business Object)

BO是业务对象,用于封装业务逻辑和操作

包含与业务相关的方法和属性,用于实现业务规则和操作

BO通常与领域模型紧密相关,用于表示业务概念和业务流程

例如:UserBO在包含了属性id和username的基础上还包含了对username的验证逻辑

// 包含业务逻辑
public class UserBO {
    private Long id;
    private String username;
    
    public boolean isValid() {
        return username != null && !username.isEmpty();
    }
}

DO数据对象(Data/Domain Object)

DO通常与BO和PO相对应,用于实现领域模型和业务逻辑,用于表示从数据存储中得到的数据

例如:

// 这里的DO和PO非常相似
public class UserDO {
    private Long id;
    private String username;
    private String password;
}

DAO数据访问对象(Data Access Object)

DAO是数据访问对象,用于封装对数据库的访问操作,也就是我们常说的Dao层

提供对数据库的增删改查等操作的接口

DAO可以隐藏底层数据库的具体实现细节,使得业务逻辑层与数据库解耦

例如:UserDao提供了对数据库表user的增删改查操作,这里的UserPO就是我们上面说的用来一一对应接收表中的字段

public interface UserDao {
    UserPO getById(Long id);
    void save(UserPO user);
    void delete(UserPO user);
    List<UserPO> findAll();
}

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

DTO是数据传输对象,用于在不同层之间传输数据

通常用于优化数据传输的性能和减少网络通信的开销。

DTO可以封装多个对象的数据,以减少网络请求次数

如果说VO一般用于前端和后端之后传输数据,那么DTO就是在后端的不同层之间传递数据,例如controller层和service层或者在服务之间结构调用的时候使用DTO

例如:

// 用于API或远程服务间的数据传输
public class UserDTO {
    private String username;
    private String email;
}

POJO普通Java对象(Plain Old Java Object)

POJO是一个简单的Java对象,没有特定的限制和约束

是一种普通的Java类,不依赖于特定的框架或接口

例如:User类是一个普通的java实体类

// 简单的Java对象,不继承或实现任何特殊的类或接口
public class User {
    private Long id;
    private String name;
}