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.pswp.cn/bicheng/95080.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/95080.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/95080.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

More Effective C++ 条款16:牢记80-20准则(Remember the 80-20 Rule)

More Effective C 条款16:牢记80-20准则(Remember the 80-20 Rule)核心思想:软件性能优化遵循帕累托原则(Pareto Principle),即大约80%的性能提升来自于优化20%的关键代码。识别并专注于这些关键…

Java中对泛型的理解

一、泛型是什么?1. 定义: 泛型允许你在定义类、接口或方法时使用类型参数(Type Parameter)。在使用时(如声明变量、创建实例时),再用具体的类型实参(Type Argument) 替换…

Redis开发06:使用stackexchange.redis库结合WebAPI对redis进行增删改查

一、接口写法namespace WebApplication1.Controllers.Redis {[ApiController][Route("/api/[controller]")]public class RedisService : IRedisService{private readonly IConnectionMultiplexer _redis;//StackExchange.Redis库自带接口public RedisService(IConne…

【前端教程】从零开始学JavaScript交互:7个经典事件处理案例解析

在网页开发中,交互性是提升用户体验的关键。JavaScript作为网页交互的核心语言,通过事件处理机制让静态页面"动"了起来。本文将通过7个经典案例,从简单到复杂,逐步讲解JavaScript事件处理的实现方法和应用场景。 案例1&…

内存模型(Memory Model)是什么?

内存模型(Memory Model)是什么? 内存模型是一个非常深刻且核心的计算机科学概念。 核心摘要 内存模型是一个契约或协议,它精确定义了: 一个线程对共享内存的写操作,如何以及何时对其他线程可见。 内存操作(读/写)可以被重新排序的程度。 它连接了硬件(CPU如何执行指令…

在 MyBatis 中oracle基本数值类型的 JDBC 类型映射

基本数值类型的 JDBC 类型Java 类型JDBC 类型 (jdbcType)说明int / IntegerINTEGER标准整数类型long / LongBIGINT大整数类型short / ShortSMALLINT小整数类型float / FloatFLOAT单精度浮点数double / DoubleDOUBLE双精度浮点数java.math.BigDecimalDECIMAL高精度小数&#xff…

Spring注解演进与自动装配原理深度解析:从历史发展到自定义Starter实践

目录 Spring注解发展史 Spring 1.X Spring 2.X Spring 2.5之前 Required Repository Aspect Spring2.5 之后 Spring 3.x ComponentScan Import 静态导入 ImportSelector ImportBeanDefinitionRegistrar EnableXXX Spring 4.x Spring 5.x 什么是SPI 自动装配…

第三届机械工程与先进制造智能化技术研讨会(MEAMIT2025)

【重要信息】 大会官网:https://www.yanfajia.com/action/p/BYE27DYDhttps://www.yanfajia.com/action/p/BYE27DYD 会议地点:哈尔滨理工大学 论文检索:EI Compendex、Scopus 还有部份版面,欲投稿从速,即将提交出版…

笔记本电脑频繁出现 vcomp140.dll丢失怎么办?结合移动设备特性,提供适配性强的修复方案

对于需要用电脑处理工作的人来说,“vcomp140.dll 丢失” 导致程序频繁闪退,无疑会严重影响工作效率。尝试重启电脑、重新安装软件后,问题依然存在,这时候该怎么办?别着急,vcomp140.dll 丢失看似棘手&#x…

微动开关-电竞鼠标核心!5000万次寿命微动开关评测

一、主流电竞微动开关技术对比‌光磁微动技术‌采用非接触式光学触发原理理论寿命突破5000万次触发响应速度0.2ms‌‌传统机械微动‌欧姆龙D2FC-F-7N系列5000万次标称寿命机械结构简单可靠‌‌创新结构微动‌双飞燕漆蓝荧光微动特殊涂层提升耐久性手感反馈独特‌二、5000万次寿…

Go语言与Docker 开发的核心应用领域

1. 容器化应用构建与部署‌‌轻量化镜像构建Go 语言编译生成静态二进制文件,结合多阶段构建的 Dockerfile,可大幅缩小镜像体积(例如使用 scratch 或 alpine 基础镜像),提升部署效率‌。示例 Dockerfile 片段&#xff1…

【ESP32-IDF】网络连接开发2:Wi‑Fi 智能配网(SmartConfig)

系列文章目录 持续更新… 文章目录系列文章目录前言一、Wi‑Fi 智能配网概述1.SmartConfig 简介2.SmartConfig 工作原理3.SmartConfig 协议类型二、Wi‑Fi 智能配网类型定义及相关API三、Wi‑Fi 智能配网示例程序总结前言 在物联网设备开发过程中,如果将 Wi-Fi 的…

CVPR深度学习研究指南:特征提取模块仍是论文创新难点

关注gongzhonghao【CVPR顶会精选】在深度学习赛道里,别只盯着堆模型卷参数了。最近不少高分工作都在打“可解释”这张牌,把原本难以理解的黑箱模型用轻量方法剖开,既能增强学术价值,还能拓展落地场景。更妙的是,这类研…

redis----list详解

列表(List)相当于数组或者顺序表一、通用命令LPUSH key value1 [value2 ...]在列表 key 的左侧(头部)插入一个或多个值。示例:LPUSH fruits apple banana → 列表变为 [banana, apple]LPUSHX 只有列表已存在时才会执行…

【python】相机输出图片时保留时间戳数据

有时候需要参考时间戳,写个笔记记录下 但是输出时间可能不稳,有待进一步优化 import cv2 import time import os# 创建一个保存图像的文件夹 output_folder "camera_images" if not os.path.exists(output_folder):os.makedirs(output_folder…

(Nginx)基于Nginx+PHP 驱动 Web 应用(上):配置文件与虚拟主机篇

1.应用场景 主要用于学习基于 Nginx PHP 驱动 Web 应用(上): 配置文件与虚拟主机篇,学习弄清楚Nginx的常规操作,之前困惑的地方。 本文主要介绍了基于NginxPHP驱动Web应用的配置方法,重点讲解了Nginx配置…

【golang长途旅行第34站】网络编程

网络编程 基本介绍核心主题:​​ Golang面向大规模后端服务程序的设计目标中,网络通信是必不可少且至关重要的部分。​两种网络编程方式:​​​TCP Socket编程​ •性质:网络编程的主流 •底层协议:基于TCP/IP协议 •举…

Hadoop(六)

目录:1.Hadoop概述2.为什么需要分布式存储3.分布式的基础架构分析4.HDFS的基础架构1.Hadoop概述2.为什么需要分布式存储3.分布式的基础架构分析4.HDFS的基础架构

Oracle 12g安装

1. 下载地址 官方网站 一般这种导向的进入的都是oracle的官方网站(先登录,如果没有就创建账号),并没有真实的12g供你下载。需要你转入Oracle的云中下载:https://edelivery.oracle.com/osdc/faces/SoftwareDelivery 。我选择的是12.1.0.2.0下…

ros2--service/服务--接口

获取service名称const char *get_service_name() const;std::string client_name client_->get_service_name();RCLCPP_INFO(this->get_logger(), "Client name: %s", client_name.c_str());