Java 中 PO、VO、POJO、DTO、DAO、Service 包等常见包名的理解

PO(bean、entity等命名)

PO(Persistent Object)持久化对象,是与数据库中表相对应的java对象,PO对象需要实现序列化接口。

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

最形象的理解就是一个PO就是数据库中的一条记录。

好处是可以把一条记录作为一个对象处理,可以方便的转为其它对象。

POJO(POJO是一种概念或者接口,身份及作用随环境变化而变化)

POJO(Plain Ordinary Java Object),简单的Java对象,名字强调它是一个普通的java对象。

POJO只有private属性以及这个属性的public的get和set方法,只能装载数据,也不能实现接口。

POJO不是JavaBean,不承担任何特殊的角色,也不实现任何接口。

另外

POJO对象有时也被称为Data对象,大量应用于表现现实中的对象。

一个POJO持久化以后就是PO。

直接用它传递、传递过程中就是DTO。直接用来对应表示层就是VO

VO(from也有此写法)

VO(Value Object)值对象,用于业务层之间的的数据传递,或者对应于页面上需要显示的数据(表单)。

主要体现在视图的对象,对于一个WEB页面将整个页面的属性封装成一个对象。然后用一个VO对象在控制层与视图层进行传输交换。

BO(service、manager、business等命名)

BO(Business Object),BO = DAO + 业务方法, 在原先DAO的基础上添加业务方法,形成BO对象。

BO中的业务方法往往是针对一个实体对象的,如果跨越多个实体对象,则方法应该放在Service中。

主要作用是把业务逻辑封装为一个对象。这个对象可以包括一个或多个其它的对象。形象描述为一个对象的形为和动作,当然也有涉及到基它对象的一些形为和动作。比如处理一个人的业务逻辑,有睡觉,吃饭,工作,上班等等形为还有可能和别人发关系的形为。这样处理业务逻辑时,我们就可以针对BO去处理。

DTO (经过处理后的PO,可能增加或者减少PO的属性)

DTO(Data Transfer Object 数据传输对象),有时候我们仅仅需要获得某一个表的几个字段,所以此时可以用DTO存储这几个字段。

主要用于远程调用等需要大量传输对象的地方。

比如我们一张表有100个字段,那么对应的PO就有100个属性。但是我们界面上只要显示10个字段,客户端用 WEB service 来获取数据,没有必要把整个PO对象传递到客户端,这时我们就可以用只有这10个属性的DTO来传递结果到客户端,这样也不会暴露服务端表结构.到达客户端以后,如果用这个对象来对应界面显示,那此时它的身份就转为VO。

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

DAO(Data Access Object)数据访问对象,此对象用于访问数据库,通常和po结合使用。

DAO中包含了各种数据库的操作方法。通过它中的方法,结合PO对数据库进行相关的操作。

Controller 控制层

主要是Action/Servlet等构成(目前Spring MVC则是通过@Controller标签使用)此层业务层与视图层打交道的中间层,负责传输VO对象和调用BO层的业务方法,负责视图层请求的数据处理后响应给视图层。

View(视图层)

主要是指由JSP、HTML等文件形成的显示层。

Service

Service层是为了处理包含多个POJO对象(即对多个表的数据操作)时,进行事务等管理。

所以Service层(其接口的实现类)被注入一个或多个DAO对象,以完成有意义的数据操作。


总结一下要用具体的X0需要看具体环境及项目架构,在不同的层、不同的应用场合,对象的身份也不一样,而且对象身份的转化也是很自然的。就像你对老婆来说就是老公,对父母来说就是子女。设计这些概念的初衷不是为了唬人而是为了更好的理解和处理各种逻辑,让大家能更好的去用面向对象的方式处理问题。在平时开发项目中大家千万过度设计各层,因为这样会带来大量的工作和重复工作。如果不是大型系统可简化一些层,因为技术是为应用服务的。

关系图如下:

上述名词在实际项目的应用举例:

  • 控制层(controller-action)

  • 业务层/服务层( bo-manager )

  • 实体层(po-entity)dao(dao)

  • 视图对象(Vo-本项目省略)

  • 视图层(view-jsp/html)

参考

《Java 中 PO、VO、POJO、DTO、DAO、Service 包等常见包名的理解》有1条评论

发表评论