初入 Java ,看不懂 各种奇奇怪怪的 PO、VO、DTO、BO、**O…求一份攻略

2023-11-16 06:27:04 +08:00
 mangojiji
一大堆疑惑:

入参时,Controller 接收哪个 O ?
Service 接收和 Mybatis 接收哪个 O ?

Mybatis 返回的可能是 PO (比如 getById 或者 selectByPrimaryKey),但也可能是自定义的 POJO 吧(比如一条复杂 Join 的结果),在这类情况下,Mybatis 返回的这些对象属于什么 O ?这些对象能被 Service 直接返回吗?

Service 应该返回什么 O 给 Controller ?

BO 又是个啥,看了不少资料愣是没整明白。

DTO 在什么时候用,有说层之间入参和输出的,也有说调用其它系统的,总之乱七八糟。。。

PS:项目没有使用 DDD ,是传统 SpringMVC+Mybatis 三层的设计。主要原因是我不懂 DDD…能力有限

最好能够配合示例代码或者伪代码,谢谢大佬们。
14082 次点击
所在节点    Java
94 条回复
fanchenio
2023-11-16 09:04:03 +08:00
一个 DTO 、一个 VO 、一个 Entity ,用就行了我感觉,没有其他的条条框框。
miaotaizi
2023-11-16 09:06:11 +08:00
哈哈, 笑死我了, 你可以试着搜搜看 V 站有多少关于这几个 O 的 帖子
ma836323493
2023-11-16 09:06:42 +08:00
我只用过 DTO 更新新增, Query 查询 VO 返回, 没关联字段可以直接返回 Entiry
zliea
2023-11-16 09:08:16 +08:00
一般上要求数据库对象和其他,毕竟数据库有些字段不想对外暴露,还是封装一层。所以我推荐 DO(Entity)+DTO 。
cooper
2023-11-16 09:08:26 +08:00
最近一个项目,就是 dto 入参、一个 vo 返回、一个 Entity 对应数据库,主要是要前后端分离,文档需要规范点。
一个人的话怎么方便怎么来。
hrapunzel
2023-11-16 09:08:44 +08:00
这些都是人为区分的, 实际开发一把梭。
mango88
2023-11-16 09:09:45 +08:00
DO 和 VO 就够了,其余随意
loszhang
2023-11-16 09:12:51 +08:00
我想楼主想说的是,如果是一个新项目,如何去规范各个层之间传递的 O 。如果是旧项目,那就按照旧项目的规范来,如果是新项目,应该是怎么规范好些?
limyel
2023-11-16 09:14:21 +08:00
如果是自己学,我有个建议,controller 入参都用 XXXReq ,返回的全是 XXXResp ,实体类用 XXXEntity ,其他管他什么层全用 XXXDTO 。

如果是在公司,真的就是别人怎么用你就怎么用,纠结这个没用。
chinaguaiu
2023-11-16 09:14:26 +08:00
java 初学就是这点很烦,这些个 O 都是人为规定的,熬一段时间熟了
nerkeler
2023-11-16 09:15:56 +08:00
request response entity 一把梭
lyusantu
2023-11-16 09:16:16 +08:00
不要为了用而用 如果一个 Service 永远只会被一个类实现,那么定义 interface 的意义是什么呢
Plutooo
2023-11-16 09:19:27 +08:00
入参一个 O ,出参一个 O ,数据库交互一个 O ,管他什么 O 还是 Entity 呢,跟项目保持一致就行了
miaotaizi
2023-11-16 09:20:23 +08:00
@lyusantu 意义就是将来需要切换的话, 你就只需要完成 interface 内的方法就行了, 而不是去一个个复制
nanjingwuyanzu
2023-11-16 09:27:30 +08:00
单一职责原则
tgich
2023-11-16 09:31:46 +08:00
@MrSheng
@fanchenio
对,别整那么多 O ,连想都不要想,影响思考
pelloz
2023-11-16 09:33:34 +08:00
其实就是看项目复杂度
1.项目很小,entity 一通到底
2.项目有点规模了,就区分一下 vo ,dto ,entity 。大部分项目区分到这里就够了。
3.项目很复杂了,根据公司需求和架构师的要求,他自然会让你知道你需要知道的部分。

那么 vo ,dto ,entity 的区分就是:
entity 就是你的数据库建模对象,简单来说就是和你的数据库字段一模一样,就放在 repository(mapper)层。
dto 就是你的数据传输对象,根据你在后端的业务实际情况定义,一般用于后端服务之间传输数据,就放在 service 层
vo 就是显示层对向,根据前端的展示需求来定义。
netabare
2023-11-16 09:33:51 +08:00
又一个被八股文祸害的
luzemin
2023-11-16 09:34:07 +08:00


如楼上说的,实际中一般就是使用了 VO 、DTO 、Entity
mangojiji
2023-11-16 09:34:34 +08:00
@limyel service 的入参也是 req 吗?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/992296

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX