PO、VO、DAO、BO、DTO、POJO 你能分清吗?

目录

[1. PO (Persistent Object) - 持久对象](#1. PO (Persistent Object) - 持久对象)

[2. VO (Value Object) - 值对象](#2. VO (Value Object) - 值对象)

[3. DAO (Data Access Object) - 数据访问对象接口](#3. DAO (Data Access Object) - 数据访问对象接口)

[4. BO (Business Object) - 业务对象层](#4. BO (Business Object) - 业务对象层)

[5. DTO (Data Transfer Object) - 数据传输对象](#5. DTO (Data Transfer Object) - 数据传输对象)

[6. POJO (Plain Old Java Object) - 简单的 Java 对象](#6. POJO (Plain Old Java Object) - 简单的 Java 对象)

区别与联系

总结


咱们今天就从程序员的视角,剖析一下这些术语,顺便给点生动的小例子,让这个话题不再是看得懂却说不清的尴尬存在。

1. PO (Persistent Object) - 持久对象

**PO 是什么?**PO 是数据库中的一张表,或者表中的一条记录在 Java 对象中的表现形式。可以简单理解为 PO 是和数据库强绑定的。它通常会和 ORM(比如 Hibernate、MyBatis)框架一起使用,用来持久化数据。

public class UserPO {
    private Long id;  // 数据库的主键
    private String name;  // 用户名
    private String email;  // 用户邮箱

    // Getter 和 Setter
}

看出来了吗?这就是个标准的 PO,它的每个字段几乎都对应了数据库表里的列,没什么特别的业务逻辑,仅仅是为了存储和读取数据。

2. VO (Value Object) - 值对象

**VO 是什么?**VO 是用于展示数据的对象,通常是前端页面或者客户端需要的数据模型。它和 PO 不同,VO 关注的是"表现形式",而不是数据怎么来的。

java 复制代码
public class UserVO {
    private String name;  // 展示用户名
    private String email;  // 展示用户邮箱

    // Getter 和 Setter
}

比如,一个用户的 VO 可能只包含用户名和邮箱,而数据库里的 PO 则可能包含密码、创建时间等 VO 不需要的字段。你会发现 VO 通常是简化后的模型,更贴近用户界面的需求。

VO 的地位,就像你去相亲,PO 是你真实的户口本,而 VO 是你精修过的照片,展现的是用户想看的那一部分。

3. DAO (Data Access Object) - 数据访问对象接口

**DAO 是什么?**DAO 是用于操作数据库的接口,负责对 PO 的增删改查(CRUD)。它让我们避免直接把 SQL 写到业务代码里,保证了代码的可维护性和解耦性。

java 复制代码
public interface UserDAO {
    UserPO findById(Long id);  // 根据 ID 查询用户
    void save(UserPO user);   // 保存用户
    void delete(Long id);     // 删除用户
}

用个场景来说,DAO 就像是去菜市场买菜的过程:你不会自己跑到地里摘菜,而是通过 DAO("买菜人")从数据库("地里")拿到 PO("蔬菜")。

4. BO (Business Object) - 业务对象层

**BO 是什么?**BO 关注的是业务逻辑,是在业务层里用来处理复杂逻辑的对象。BO 可以组合多个 PO 或者其他模型,专注于业务实现。

java 复制代码
public class UserBO {
    private Long id;
    private String name;

    public void activate() {
        // 激活用户的业务逻辑
        System.out.println("用户激活成功");
    }
}

如果 PO 是数据存储的基石,BO 就是穿上西装准备开会的你------不但得有数据,还得有行为,处理各种业务需求。

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

**DTO 是什么?**DTO 主要用于在不同层之间传输数据,尤其是在服务调用(比如 REST 接口)或者分布式系统中传输数据时。DTO 和 VO 很像,但 VO 偏向于展示,而 DTO 偏向于跨层传输。

java 复制代码
public class UserDTO {
    private String name;  // 用户名
    private String email; // 用户邮箱

    // Getter 和 Setter
}

DTO 的作用是"轻装上阵",剔除不必要的字段,只传递需要的数据,尽量减少传输的开销。

6. POJO (Plain Old Java Object) - 简单的 Java 对象

**POJO 是什么?**POJO 是所有这些模型的"老祖宗"。它只是一个不带任何框架和注解的普通 Java 对象,没有任何特殊的附加功能。POJO 可以是 PO、VO、DTO 的基础。

java 复制代码
public class SimplePOJO {
    private String data;

    // Getter 和 Setter
}

写过 Java 的人几乎都会写 POJO,但 POJO 本身不是一个严格的规范,更多是个术语,用来形容那些普通又"纯净"的类。

所有复杂的模型,最终都是 POJO 的"子孙"。

区别与联系

到这里,你可能会问:这么多对象,怎么区分和使用呢?

  1. PO、DAO

    PO 和 DAO 是"数据库好搭档"。PO 是数据的实体,DAO 是负责操作 PO 的"搬运工"。

  2. VO、DTO

    VO 和 DTO 是"数据传输好兄弟"。VO 服务于前端,DTO 服务于跨层数据传输。两者都偏向于轻量化。

  3. BO

    BO 是业务逻辑的"大脑",它是最贴近实际需求的部分,包含了业务规则和实现。

  4. POJO

    POJO 是底层的基础,所有这些花哨的对象,都脱胎于普通的 POJO。

总结

  • PO(Persistent Object)持久化对象
    • 角色:真实的存储代表。
    • 解释:PO与数据库中的表记录直接对应,通常用于表示数据库中的一行数据。它是数据持久化的核心,承载着数据的存储与检索任务。
  • VO(View Object)视图对象
    • 角色:漂亮的外衣。
    • 解释:VO主要用于前端展示层,封装了展示给用户的数据。它根据用户需求进行定制,只包含前端需要展示的数据字段,为前端提供友好的数据接口。
  • DAO(Data Access Object)数据访问对象
    • 角色:操作PO的搬运工。
    • 解释:DAO是数据访问层的核心,负责PO的持久化操作,如CRUD(创建、读取、更新、删除)等。它充当了PO与数据库之间的桥梁,使得业务逻辑层能够专注于业务处理,而无需关心数据持久化的细节。
  • BO(Business Object)业务对象
    • 角色:业务逻辑的操盘手。
    • 解释:BO封装了业务逻辑的处理流程,是业务层的核心。它接收来自前端或其他服务的请求,调用DAO层进行数据访问,并根据业务需求进行数据处理和逻辑判断,最终返回处理结果。
  • DTO(Data Transfer Object)数据传输对象
    • 角色:传输数据的邮差。
    • 解释:DTO主要用于服务之间的数据传输,它封装了需要传输的数据字段,并提供了数据的getter和setter方法。DTO使得服务之间的数据传输更加清晰和简洁,避免了传输不必要的数据字段。
  • POJO(Plain Old Java Object)简单Java对象
    • 角色:所有这些的原型。
    • 解释:POJO是一个简单的Java对象,它不依赖于任何特殊的类库或框架,只包含Java语言的基本元素(如类、字段、方法等)。POJO可以作为其他复杂对象的原型或基础,通过添加特定的功能或属性来转变为其他类型的对象(如PO、VO、DAO、BO、DTO等)。

多理解,多实践,分清这些概念其实并不难。如果还觉得绕,不妨给自己写点代码试试,毕竟写代码才是检验理解的最佳方式。

如果文章对您有帮助,还请您点赞支持
感谢您的阅读,欢迎您在评论区留言指正分享

相关推荐
菠菠萝宝4 分钟前
【Java八股文】11-分布式及场景面试篇
java·分布式·面试·k8s·系统·uuid·mq
LUCIAZZZ11 分钟前
Https解决了Http的哪些问题
java·网络·网络协议·spring·http·rpc·https
论迹32 分钟前
【JavaEE】-- 多线程(初阶)2
java·开发语言·java-ee
桃子是唯一的水果41 分钟前
java 单例模式(Lazy Initialization)实现遍历文件夹下所有excel文件且返回其运行时间
java·单例模式·maven
+72043 分钟前
如何在java中用httpclient实现rpc post 请求
java·开发语言·rpc
ybq1951334543144 分钟前
javaEE-SpringBoot日志
java·spring boot·后端
火烧屁屁啦1 小时前
【JavaEE进阶】图书管理系统 - 贰
java·spring
xzzd_jokelin1 小时前
Spring AI 接入 DeepSeek:开启智能应用的新篇章
java·人工智能·spring·ai·大模型·rag·deepseek
刘什么洋啊Zz1 小时前
剖析IO原理和零拷贝机制
java·运维·网络
卷心菜好6啊1 小时前
特辣的海藻!2
java