JavaPO,BO,VO,DTO,POJO,DAO 概念

警告
本文最后更新于 2024-05-23,文中内容可能已过时。

Java PO,BO,VO,DTO,POJO,DAO 概念

一篇文章讲清楚 VO,BO,PO,DO,DTO 的区别 - 知乎 (zhihu.com)

https://blog.meowrain.cn/api/i/2023/11/16/h1d0pz-3.webp

POJO (Plain Old Java Object)

Java POJO (Plain Old Java Object) 是指一个最基本的、普通的 Java 对象。POJO 通常具有以下特点:

只包含私有属性,没有 public、protected 的属性。属性通常用 private 修饰。 提供 getter 和 setter 方法来访问和修改属性。 不继承或实现任何特定的接口和类。 不包含任何注解。 不依赖外部 jar 包和类库。 除了基本的构造方法、getter/setter 方法、equals/hashCode/toString 方法之外,没有任何其他方法。 POJO 主要用于表示简单的数据结构,其设计符合面向对象的基本原则,可以很方便地进行序列化和反序列化。在 Java Web 应用中,POJO 常用来接收和传递数据,例如作为 Model 对象。Spring 框架也大量采用 POJO 设计模式。所以简单来说,POJO 就是一个最基本的 Java 类,没有复杂的依赖关系,用来表示简单的数据模型。

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

DTO 是一个比较特殊的对象,他有两种存在形式:

在后端,他的存在形式是 java 对象,也就是在 controller 里面定义的那个东东,通常在后端不需要关心怎么从 json 转成 java 对象的,这个都是由一些成熟的框架帮你完成啦,比如 spring 框架

在前端,他的存在形式通常是 js 里面的对象(也可以简单理解成 json),也就是通过 ajax 请求的那个数据体

这也是为什么把他画成横跨两层的原因

这里可能会遇到个问题,现在微服务盛行,服务和服务之间调用的传输对象能叫 DTO 吗?
我的理解是看情况
DTO 本身的一个隐含的意义是要能够完整的表达一个业务模块的输出
如果服务和服务之间相对独立,那就可以叫 DTO
如果服务和服务之间不独立,每个都不是一个完整的业务模块,拆开可能仅仅是因为计算复杂度或者性能的问题,那这就不能够叫做 DTO,只能是 BO

VO (View Object)

VO 就是展示用的数据,不管展示方式是网页,还是客户端,还是 APP,只要是这个东西是让人看到的,这就叫 VO
VO 主要的存在形式就是 js 里面的对象(也可以简单理解成 json)

VO 和 DTO 的区别

https://blog.meowrain.cn/api/i/2023/11/16/h2riqy-3.webp

PO (bean,entity 等命名)

Persisitant Object 持久对象,数据库表中的记录在 java 对象中的显示状态

一个 PO 的数据结构对应着库中表的结构,表中的一条记录就是一个 PO 对象

通常 PO 里面除了 get,set 之外没有别的方法
对于 PO 来说,数量是相对固定的,一定不会超过数据库表的数量
等同于 Entity,这俩概念是一致的

BO(Business Object)业务对象
BO 就是 PO 的组合
简单的例子比如说 PO 是一条交易记录,BO 是一个人全部的交易记录集合对象
复杂点儿的例子 PO1 是交易记录,PO2 是登录记录,PO3 是商品浏览记录,PO4 是添加购物车记录,PO5 是搜索记录,BO 是个人网站行为对象
BO 是一个业务对象,一类业务就会对应一个 BO,数量上没有限制,而且 BO 会有很多业务操作,也就是说除了 get,set 方法以外,BO 会有很多针对自身数据进行计算的方法
为什么 BO 也画成横跨两层呢?原因是现在很多持久层框架自身就提供了数据组合的功能,因此 BO 有可能是在业务层由业务来拼装 PO 而成,也有可能是在数据库访问层由框架直接生成
很多情况下为了追求查询的效率,框架跳过 PO 直接生成 BO 的情况非常普遍,PO 只是用来增删改使用

BO 和 DTO 的区别

这两个的区别主要是就是字段的删减
BO 对内,为了进行业务计算需要辅助数据,或者是一个业务有多个对外的接口,BO 可能会含有很多接口对外所不需要的数据,因此 DTO 需要在 BO 的基础上,只要自己需要的数据,然后对外提供
在这个关系上,通常不会有数据内容的变化,内容变化要么在 BO 内部业务计算的时候完成,要么在解释 VO 的时候完成

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

DAO (Data Access Object) 是数据访问对象的简称,是 JavaWeb 应用中用于封装对数据源的访问的组件。

DAO 主要具有以下特征:

封装了对数据源 (通常是关系型数据库) 的访问,屏蔽了数据源的访问细节。 定义了操作数据所需要的接口方法,例如 CRUD (创建、读取、更新、删除) 接口。 与具体的数据源解耦,如果需要改变底层的数据源,只需要改变 DAO 层的实现,不影响调用它的 Service 层。 通常与 POJO 和 Model 对象交互,将 Model 对象持久化到数据库,或者从数据库读取数据到 Model 对象。 不同的 DAO 负责不同的数据模型对象,DAO 可以分为 UserDAO、ProductDAO 等。 DAO 被 Service 层调用,Service 层依赖 DAO 执行数据访问和持久化操作。 所以 DAO 层主要作用是为高层应用屏蔽数据库的访问细节,提供简单的 CRUD 接口来操作 POJO 对象,实现业务逻辑和数据访问的分离。它是表现层和持久层之间的桥梁和中介。


相关内容

0%