一般一个项目会有多个模块组成,每个模块是一个包(package),一个模块包下由若干个包(package)组成,这些包就是该模块下细分的组成部分,一般一个模块包下都由以下几个package组成:
**controller**:该模块对应的controller接口,也是直接向外提供的接口;service:一般由service接口和实现了service接口的serviceImpl类组成;dao:dao层接口提供持久化的能力,service里对数据库的操作会调用dao层提供的接口;model:实体类,也是我们这篇文章里讲的实体类存放的package;util:工具类,比如json转换工具,字符串处理工具等会写在这里,写一个Utils类通过静态方法提供;mapper:比如常见的ORM框架MyBatis,需要写sql语句和dao层接口中间交互的接口类。
我们今天介绍的实体类对象,比如responseEntity,requestEntity,还有一些业务实体抽象成的类都称为实体类,统一放在模块包下的model包底下,这些实体类一般分为VO、DTO、BO和PO,至于阿里编程规范里的DO、TO是业务层面划分更细的范畴,在这里不做讨论。
1、POJO DAO
讲道理POJO和DAO这两个概念其实跟我们这篇文章讲的内容本应不是一个东西,POJO还沾点边,DAO是一点不沾边,但网上区分概念的时候竟也把这两个概念也一并区分了,这里我也介绍一下。
POJO就是我们平常泛指的Java实体类,VO、BO、DTO和PO都属于POJO的范畴,打个比方,POJO就是一个抽象类,VO、BO这些就是实现了这个抽象类的实体类。
DAO压根跟Java实体类就没关系,DAO跟controller、service是一组概念,都属于MVC或者SpringBoot开发的一套约定俗成的框架,DAO层一般在代码里是由若干DAO层接口和实现了这些接口的DaoImpl组成,里面是对数据库操作的封装,即业务层不关心底层是怎么操作数据库或者怎么写sql语句的,业务层只负责调用,具体怎么实现由dao层接口和具体的mapper.xml去实现。
2、DTO
DTO是Data Transfer Object 的缩写,DTO代表服务层需要接收的数据和返回的数据。一般后端会给前端提供restful风格的API接口,前端同学从这些API接口的返回体(一般是json,少部分是xml)里获取他们想要的字段和对应的数据,或者将一些信息放到API接口的请求体(一般是json,少部分是xml)传给后端同学,接口的请求体和返回体就是很典型的DTO。代码中我们的controller类的requestEntity和responseEntity就是DTO,命名是可以考虑RqDTO和RpDTO。
3、VO
VO是Value Object的缩写,代表展示层需要显示的数据。个人理解VO里的属性应该仅用来做前端页面的展示,不应涉及具体的业务逻辑。DTO和VO的概念有些不好区分,举个例子,有个getUser()接口,返回用户的信息,其中性别字段,DTO里可能是用0和1代表男和女,但是在展示层的VO可能是“帅哥”和“美女“,u1s1项目里的VO和DTO我感觉也是随便起的名字……但后台服务与服务间的调用应该使用DTO,不应出现VO。
4、BO
BO是Business Object 的缩写,用于表示一个业务对象。在代码里各个serviceImpl间调用所传递的实体类基本都是BO,一个业务流程可能需要调用多个serviceImpl的接口,那就涉及多个BO来完成,BO一般比较复杂,经常出现一个BO里的属性类型是另一个BO类。
5、PO
PO 是 Persistant Object 的缩写,持久化对象,用于将数据库表的各个字段与业务对象的各个属性做映射,一般针对的是关系型数据库。一般在serviceImpl里调用DAO层接口,接口里传入的对象就是PO对象,ORM的mapper接口里传入的对象也是PO对象。这里有个问题,既然有了BO了为什么还需要PO呢?原因有两个,一是可能会涉及到sql的速度效率,另一个是隐藏数据库表的设计。
6、实体类对象关系图
参考
对DO VO BO DTO POJO的概念与区别(笔记)
PO BO VO DTO POJO DAO DO这些Java中的概念分别指一些什么?
