JavaEE开发中,分层领域模型规约

在使用O/RM框架时,通常将某个数据库表映射为某个Java类,将该表的某列映射为该Java类的某个属性。对此Java类,《阿里巴巴Java开发手册》里称之为DO(Data Object),即与数据库表结构一一对应,通过 DAO 层向上传输数据源对象。也有资料称之为PO(Persistent Object)或Entity。但PO很容易让人和POJO(Plain Ordinary Java Object)混淆。

在Web开发中,提交表单时表单里的信息项需要映射为Controller层某个方法参数里的Java类。其逆过程,如查看某某业务对象详情时,也需要将该Java类交给模板引擎(如Velocity等)进行渲染,或者序列化为JSON串交给前端工程(如Vue等)进行渲染。此场景,对应《阿里巴巴Java开发手册》里哪个我有点不确定。

Service层某方法,可能需要3、5个或更多基本类型参数,通常需要把这些参数封装到一个Java类。此场景,对应《阿里巴巴Java开发手册》里哪个我有点不确定。

某个数据库表映射为某个Java类,该类有20、30个或更多属性,但前端页面仅需要查询并展示其中的很少几个属性。偷懒的做法是直接把该Java类返回给模板引擎或前端工程。但最好是新增一个Java类,要遵循“最少暴露原则”。此场景,对应《阿里巴巴Java开发手册》里哪个我有点不确定。

等等场景。

当团队成员不能简单地和分层领域模型规约对上号时,他就会按自己的理解随便选一个。久而久之,就乱了。基于此,我建议简化处理,仅把领域模型分为两类:一类是DO(Data Object),其余都是DTO(Data Transfer Object)。不建议使用BO(Business Object),当你在开发某个业务系统时,很难分清哪些不是业务对象,莫不如找一个更中性的,即DTO。

举例,假设我们在开发一个简历编辑保存页面和一个查询简历详情页面,简历包括:个人基本信息、教育经历和工作经历。可以建3个DO,对应数据库里3张表:

  • BaseInfoDO.java
  • EducationalExperienceDO.java
  • WorkExperienceDO.java

和1个DTO:

  • ResumeDTO.java,该类1对1关联BaseInfoDO.java,1对多关联EducationalExperienceDO.java和WorkExperienceDO.java

附《阿里巴巴Java开发手册》

3.【参考】分层领域模型规约:
DO(Data Object) :与数据库表结构一一对应,通过 DAO 层向上传输数据源对象。
DTO(Data Transfer Object) :数据传输对象, Service 或 Manager 向外传输的对象。
BO(Business Object) :业务对象。 由 Service 层输出的封装业务逻辑的对象。
AO(Application Object): 应用对象。 在 Web 层与 Service 层之间抽象的复用对象模型,极为贴近展示层,复用度不高。
VO(View Object) : 显示层对象,通常是 Web 向模板渲染引擎层传输的对象。
Query:数据查询对象,各层接收上层的查询请求。 注意超过 2 个参数的查询封装,禁止使用 Map 类来传输。

资料
  • https://stackoverflow.com/questions/1612334/difference-between-dto-vo-pojo-javabeans
  • https://blog.csdn.net/weixin_41485592/article/details/81977539
  • https://www.jianshu.com/p/b934b0d72602
  • https://my.oschina.net/liaodo/blog/2988512
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值