【Java】关于PO、BO、VO、DTO、DAO、POJO等概念的理解
# 【Java】关于 PO、BO、VO、DTO、DAO、POJO 等概念的理解
# PO(Persistant Object)持久对象
PO 是持久化对象,用于表示数据库中的一条记录映射成的 Java 对象,类中应该都是基本数据类型和 String,而不是更复杂的类型,因为要和数据库表字段对应。PO 仅仅用于表示数据,不对数据进行操作,拥有 get 和 set 方法。对象类中的属性对应数据库表中的字段,有多少个字段就有多少个属性,完全匹配。遵循 JavaBean 规范,拥有 get 和 set 方法。如下图所示:
# DO(Data Object)数据对象
数据对象,与数据库表结构一一对应,通过 dao 层向上传输数据对象,属性和 PO 中的基本一致。
# AO(Application Object)应用对象
在 Web 层与 Service 层之间抽象的复用对象模型,极为贴近展示层,复用度不高。
# BO(Business Object)业务对象
BO 是实际的业务对象,会参与业务逻辑的处理操作,里面可能会包含多个类,用于表示一个业务对象。例如用户可以拥有宠物,在这里把用户对应一个 PO、宠物对应一个 PO,那么建立一个对应的 BO 对象来处理用户和宠物的关系,每个 BO 都包含用户 PO 和宠物 PO,而处理逻辑时针对 BO 去处理。遵循 JavaBean 规范,拥有 get 和 set 方法。例如:(注:User 和 Pet 都是 PO 对象,但会放进 BO 中,形成一个复杂的业务对象。)
但注意,BO 又包括了业务逻辑,通常在 service 层,封装了对 DAO 层的调用,可以进行 PO 与 VO/DTO 之间的转换。
# VO(Value Object)表现对象
VO 对象主要用于前端界面显示的数据,是与前端进行交互的 Java 对象,但这里是不用 PO 传递数据的,因为 PO 包括数据库表中的所有字段,对于前端来说我们只需要显示一部分字段就可以了,例如我们的用户表 user 中的 password(密码)字段、phone(电话)字段、insert_time(插入时间)字段是没有必要也不能显示在前端界面的。遵循 JavaBean 规范,拥有 get 和 set 方法。
# DTO(Data Transfer Object)数据传输对象
数据传输对象是在传递给前端时使用的,如一张表有 100 个字段,那么对应的 PO 就有 100 个属性,但是我们的前端界面只需要显示 10 个字段,所以我们没必要把所有字段的 PO 对象传递到客户端,我们只需要把只有这 10 个属性的 DTO 对象传递到客户端,不会暴露服务端的表结构,到达客户端后,如果这个对象用于界面表示,那么它的身份就是 VO 对象。
DTO 和 VO 概念相似,通常情况下字段也基本一致。但有所不同,DTO 表示一个数据传输对象,是在服务端用于不同服务或不同层之间的数据传输,例如 dao 层到 service 层,service 层到 web 层;而 VO 是在客户端浏览器显示的表现对象,用于在浏览器界面数据的显示。
# DAO(Data Access Object)数据访问对象
DAO 是主要封装对数据库的访问,例如 UserDao 封装的就是对 user 表的增删改查操作。
通过它可以把 POJO 持久化为 PO,用 PO 组装出 VO 和 DTO。
DAO 一般在持久层,完全封装数据库操作,对外暴露的方法的使得上层不需要关注数据库的相关信息,只需要插入、删除、更新、查询即可。
# POJO(Plain Ordinary Java Object)简单 Java 对象
表示一个个简单的 Java 对象,而 PO、VO、DTO 都是典型的 POJO,而 DAO 和 BO 一般不是 POJO,只是提供了一些调用方法。
POJO 是 DO、DTO、BO、VO 的统称。
# 实例
有一个博客系统,数据库中存储了很多篇博客。我们会做如下设计:
- 数据库表:表中的博客包括编号、博客标题、博客内容、博客标签、博客分类、博客状态、创建时间、修改时间等。
- PO:包括编号、博客标题、博客内容、博客标签、博客分类、博客状态、创建时间、修改时间等。(与数据库表中的字段一样。)
- VO:在客户端浏览器展示的页面数据,博客标题、博客内容、博客标签、博客分类、创建时间、上一篇博客 URL、下一篇博客 URL。
- DTO:在服务端数据传输的对象,编号、博客标题、博客内容、博客标签、博客分类、创建时间、上一篇博客编号、下一篇博客编号。
- DAO:数据库增删改查的方法,例如新增博客、删除博客、查询所有博客、更新博客。
- BO:基本业务操作,如管理分类、管理标签、修改博客状态等,是我们常说的 service 层操作。
参考链接:
# 关于我
Brath 是一个热爱技术的 Java 程序猿,公众号「InterviewCoder」定期分享有趣有料的精品原创文章!
非常感谢各位人才能看到这里,原创不易,文章如果有帮助可以关注、点赞、分享或评论,这都是对我的莫大支持!