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

文摘   2024-11-26 12:07   陕西  

这次我们聊个技术圈里的经典灵魂拷问:“PO、VO、DAO、BO、DTO、POJO 能分清吗?”别急着点头或者摇头,就算是写过不少代码的老程序员,也有时候会被这些概念绕晕。


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

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 关注的是“表现形式”,而不是数据怎么来的。
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 写到业务代码里,保证了代码的可维护性和解耦性。
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 或者其他模型,专注于业务实现。
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 偏向于跨层传输。
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 的基础。
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. POJOPOJO 是底层的基础,所有这些花哨的对象,都脱胎于普通的 POJO。

小总结

最后送大家一条简单的“公式”记住它们:
  • PO:数据库 = 真实的存储
  • VO:前端 = 漂亮的外衣
  • DAO:操作 PO 的搬运工
  • BO:业务逻辑的操盘手
  • DTO:传输数据的邮差
  • POJO:所有这些的原型
多理解,多实践,分清这些概念其实并不难。如果还觉得绕,不妨给自己写点代码试试,毕竟写代码才是检验理解的最佳方式。😊

-END-


ok,今天先说到这,老规矩,给大家分享一份不错的副业资料,感兴趣的同学找我领取。

以上,就是今天的分享了,看完文章记得右下角给何老师点赞,也欢迎在评论区写下你的留言

程序员老鬼
10年+老程序员,专注于AI知识普及,已打造多门AI课程,本号主要分享国内AI工具、AI绘画提示词、Chat教程、AI换脸、Chat中文指令、Sora教程等,帮助读者解决AI工具使用疑难问题。
 最新文章