当前位置: 首页 > backend >正文

java中的VO、DAO、BO、PO、DO、DTO

VO、DAO、BO 等对象

在了解这里 po、vo、dao、之前先介绍下 MVC 开发模式

  • M层负责与数据库打交道;
  • C层负责业务逻辑的编写;
  • V层负责给用户展示(针对于前后端不分离的项目,不分离项目那种编写模版的方式,理解V的概念更直观)。

而VO,BO,PO,DO,DTO呢,就是穿梭在这M、V、C层之间的实体传输对象

阿里巴巴规范手册关于VO,BO,PO,DO,DTO这些的描述

分层领域模型规约:

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

领域模型命名规约:

  • 数据对象:xxxDO,xxx即为数据表名
  • 数据传输对象:xxxDTO,xxx为业务领域相关的名称。
  • 展示对象:xxxVO,xxx一般为网页名称。
  • POJO是DO/DTO/BO/VO的统称,禁止命名成xxxPOJO。

Pojo 和 javabean

POJO是 Plain Old Java Object 的简写,大概意思就是“淳朴的Java对象”。这个词是国外一家外包公司的员工创造的。哪些类是POJO类还是有说法的,需要同时满足以下几个条件:

1. 不实现任何接口的类。

2. 不继承任何其它类的类。

3. 不使用任何外部注解的类。

这种类其实就是切断了和外界联系的Java类,下面这个类肯定不是:

@Data
public class Dog {private String name;private Integer age;
}

这个类才是

public class Dog {private String name;private Integer age;
}

Java Bean也经常出现在各种技术文献中,也不是随便什么类都能叫做Java Bean的,它需要有以下定义:

● 有无参数构造。

● 所有的属性必须是私有属性(private)。

● 所有的属性必须有公共的(public)的Getter和Setter。

● 它必须是可以被序列化的,也就是实现 java.io.Serializable接口。

按照这个定义,POJO类如果想成为Java Bean,需要改造成下面的形式

import java.io.Serializable;public class Dog implements Serializable {private static final long serialVersionUID = 6723564465081191620L;private String name;private Integer age;public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}
}

其实在Spring 中对于 Bean的要求就低多了,只要这个类(接口)被注入了Spring IoC,那么这个类(接口)都可以被称作一个Spring Bean。所以一个POJO总是孤孤单单的,它不可能成为一个Java Bean或者Spring Bean,但是Java Bean可以同时是一个Spring Bean;Spring Bean也可以是一个Java Bean

项目中真的有必要定义VO,BO,PO,DO,DTO吗?

还是要理性看待这个问题,要看项目“目的地”是什么。

如果项目比较小,是一个简单的MVC项目,又是单兵作战,不建议使用VO,BO,PO,DO,DTO,直接用POJO负责各个层来传输就好,因为这种项目的“目的地”是快速完成。

而更多的时候,是持续迭代的团队协作项目,这个时候就建议用VO,BO,PO,DO,DTO,而且团队内要达成共识,形成一个标准规范。

不管用哪种方式,只要团队内定义好一种适应的协同规范就行。没有一个绝对好与绝对坏的方式方法,团队规范的尽头能提升项目的可扩展性、可维护性与可阅读性,从而降低bug率。

http://www.xdnf.cn/news/19214.html

相关文章:

  • 【重学 MySQL】九十三、MySQL的字符集的修改与底层原理详解
  • 项目管理和产品管理的区别
  • 【gflags】安装与使用
  • 2025 批量下载雪球和东方财富帖子和文章导出excel和pdf
  • 一体化步进伺服电机在视觉检测设备中的应用案例
  • 弱内存模型和强内存模型架构(Weak/Strong Memory Model)
  • vue3多个el-checkbox勾选框设置必选一个
  • 一款支持动态定义路径的JAVA内存马维权工具Agenst
  • 科普文章:广告技术平台的盈利模式全景
  • 2025 批量下载hasmart所有知乎回答,文章和想法,导出txt,html和pdf
  • 指纹云手机网络环境隔离技术:筑牢海外社媒多账号运营安全屏障
  • 计算机--网络编程
  • Flutter 跨平台开发环境搭建指南
  • CVPR深度学习论文创新合集拆解:模型训练速度算提升
  • 数据库原理及应用_数据库基础_第3章数据库编程_常用系统函数
  • QWidget和QML模式下阻止槽调用的方法总结
  • 复现论文块体不锈钢上的光栅耦合表面等离子体共振
  • 【杂谈】-混沌理论能否赋予机器差异化思考能力?
  • vscode+cmake+mingw64+opencv环境配置
  • 《HM-RAG: Hierarchical Multi-Agent Multimodal Retrieval Augmented Generation》
  • 回归问题的损失函数
  • C++中的临时对象与移动语义——深入理解与实践
  • 算法复习笔记: 双指针_二分查找篇
  • GitCode全方位解析:开源新星的崛起与极致实战指南
  • 果蔬采摘机器人:自动驾驶融合视觉识别,精准定位,高效作业
  • 【前端教程】DOM 操作入门专栏:从基础到实战
  • 现代 Linux 发行版为何忽略Shell脚本的SUID位?
  • 【LeetCode每日一题】21. 合并两个有序链表 2. 两数相加
  • openEuler2403安装部署PostgreSQL17
  • 接口自动化测试框架