> For the complete documentation index, see [llms.txt](https://tommyyang.gitbook.io/javainterview/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://tommyyang.gitbook.io/javainterview/web/pojo-bo-vo-do-dto-dao-po-etc.md).

# JavaWeb 中 POJO、BO、VO、DO、DTO、DAO、PO 详细介绍

## PO

**PO**（持久对象）是 Persistent Object 的缩写，用于表示数据库中的一条记录映射成 Java 对象。PO 仅仅用于表示数据，没有任何数据操作。通常遵守 Java Bean 规范，拥有 getter/setter 方法。

## BO

**BO**（业务对象）是 Business Object 的缩写，用于表示一个业务对象，可以进行 PO 与 VO/DTO 之间的转换。BO 通常位于业务层，要区别于直接对外提供服务的服务层；BO 提供了基本业务单元的基本业务操作，在设计上属于被服务层业务流程调用的对象，一个业务流程可能需要调用多个 BO 来完成。也可以理解我们开发中的 Service 对象。

## DO

**DO**（领域对象）是 Domain Object 的缩写。个人觉得可以代替 PO，用于表示数据库对象，

## VO

**VO** 是 Value Object 的缩写，用来表示一个与前端进行交互的 Java 对象。通常拥有 Java Bean 的规范，拥有 getter/setter 方法。

## DTO

**DTO**（数据传输对象） 是 Data Transfer Object 的缩写，用于表示一个数据传输对象。DTO 通常用于不同服务或服务不同分层之间的数据传输。DTO 与 VO 概念类似，并且通常情况下字段基本一致。但 DTO 与 VO 又有一些不同，这个不同之处主要实在设计理念上，比如 API 服务需要使用的 DTO 就可能与 VO 存在差异。通常拥有 Java Bean 的规范，拥有 getter/setter 方法。

## DAO

**DAO**（数据访问对象） 是 Data Access Object 的缩写，用来表示一个数据访问的对象。使用 DAO 访问数据库，包括 CRUD 等操作，与 PO 一起使用。DAO 一般在持久层，完全封装数据库操作，对外暴露的方法使得上层应用不需要关注数据库相关的任何信息。

## POJO

**POJO** 是 Plain Ordinary Java Object 的缩写。是 PO、DO、VO、DTO 的统称。不会将一个对象命名为以 POJO 结尾。

**注意**：为什么需要定义这些 Object 对象呢？

个人觉得是因为每一层负责每一层的工作，然后也可以减少传输数据量的大小和保护数据库结构不外泄。如果你所有地方都使用 PO 对象，那么前端就很轻易的知道了你的数据库结构，同时有些数据根本不用传到前端的（可以节省传输数据量的大小），比如我们一些数据库里面表示是否删除、更新时间等这些字段，是不需要让前端知道的。
