首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

这次我们聊个技术圈里的经典灵魂拷问:“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 的“子孙”。

区别与联系

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

PO、DAO

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

VO、DTO

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

BO

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

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

小总结

最后送大家一条简单的“公式”记住它们:

PO:数据库 = 真实的存储

VO:前端 = 漂亮的外衣

DAO:操作 PO 的搬运工

BO:业务逻辑的操盘手

DTO:传输数据的邮差

POJO:所有这些的原型

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

  • 发表于:
  • 原文链接https://page.om.qq.com/page/Oo7LX2YLbt3Ctj1yLUxxODSw0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券