颓C#实现屏幕墙:同时监控多个电脑桌面(支持Windows、信创Linux、银河麒麟、统信UOS)U

快速了解开发过程中VO、DTO、BO、 DO、PO、POJO、Entity的概念、区别、作用 快速了解VO、DTO、BO、DO、PO、POJO、Entity的概念、区别和作用 阅读详情

前言

最近有小伙伴问我:O、VO、BO、DTO、DAO、POJO有什么区别?

第一眼看到,你可能也会有点懵。

这些对象的概念很多,确实容易搞混。

今天这篇文章跟大家一起聊聊这6种对象的含义、职责、区别和常见的坑,希望对你会有所帮助。

一、6种对象的职责边界

对象设计的本质是关注点分离——每个对象只做一件事,且做好它!

1.1 PO

它的含义是Persistent Object,即持久化对象。

职责:与数据库表严格1:1映射,仅承载数据存储结构

特征:

属性与表字段完全对应

无业务逻辑方法(仅有getter/setter)

代码示例:

public class UserPO {

private Long id; // 对应表主键

private String name; // 对应name字段

}

1.2 DAO

它的含义是Data Access Object,即数据访问对象。

职责:封装所有数据库操作(CRUD),隔离业务与存储细节

特征:

接口方法对应SQL操作

返回PO或PO集合

代码示例:

public interface UserDao {

// 根据ID查询PO

UserPO findById(Long id);

// 分页查询

List findPage(@Param("offset") int offset, @Param("limit") int limit);

}

底层原理:DAO模式 = 接口 + 实现类 + PO

image

1.3 BO

它的含义是Business Object,即业务对象。

职责:封装核心业务逻辑,聚合多个PO完成复杂操作

特征:

包含业务状态机、校验规则

可持有多个PO引用

代码示例:订单退款BO

public class OrderBO {

// 主订单数据

private OrderPO orderPO;

// 子订单项

private List items;

// 业务方法:执行退款

public RefundResult refund(String reason) {

if (!"PAID".equals(orderPO.getStatus())) {

throw new IllegalStateException("未支付订单不可退款");

} // 计算退款金额、调用支付网关等 }

}

1.4 DTO

它的含义是Data Transfer Object,即数据传输对象。

职责:跨层/跨服务数据传输,屏蔽敏感字段

特征:

属性集是PO的子集(如排除password字段)

支持序列化(实现Serializable)

代码示例:用户信息DTO

public class UserDTO implements Serializable {

private Long id;

private String name;

}

1.5 VO

它的含义是View Object,即视图对象。

职责:适配前端展示,包含渲染逻辑

特征:

属性可包含格式化数据(如日期转yyyy-MM-dd)

聚合多表数据(如订单VO包含用户名字)

代码示例:

public class OrderVO {

private String orderNo;

private String createTime; // 格式化后的日期 private String userName; // 关联用户表字段

//状态码转文字描述

public String getStatusText() {

return OrderStatus.of(this.status).getDesc();

}

}

1.6 POJO

它的含义是Plain Old Java Object,即普通Java对象。

职责:基础数据容器,可扮演PO/DTO/VO角色

特征:

只有属性+getter/setter

无框架依赖(如不继承Spring类)

典型实现:Lombok简化代码

// 自动生成getter/setter

@Data

public class UserPOJO {

private Long id;

private String name;

}

二、主流的对象流转模型

场景1

传统三层架构(DAO → DTO → VO)。

适用系统:后台管理系统、工具类应用

核心流程:

image

代码示例:用户查询服务

// Service层

public UserDTO getUserById(Long id) {

UserPO userPO = userDao.findById(id); // 从DAO获取PO

UserDTO dto = new UserDTO();

dto.setId(userPO.getId());

dto.setName(userPO.getName()); // 过滤敏感字段

return dto; // 返回DTO

}

// Controller层

public UserVO getUser(Long id) {

UserDTO dto = userService.getUserById(id);

UserVO vo = new UserVO();

vo.setUserId(dto.getId());

vo.setUserName(dto.getName());

vo.setRegisterTime(formatDate(dto.getCreateTime())); // 格式化日期

return vo;

}

优点:简单直接,适合CRUD场景

缺点:业务逻辑易泄漏到Service层

场景2

DDD架构(PO → DO → DTO → VO)。

适用系统:电商、金融等复杂业务系统

核心流程:

image

关键角色:DO(Domain Object)替代BO

代码示例:订单支付域

// Domain层:订单领域对象

public class OrderDO {

private OrderPO orderPO;

private PaymentPO paymentPO;

// 业务方法:支付校验

public void validatePayment() {

if (paymentPO.getAmount() < orderPO.getTotalAmount()) {

throw new PaymentException("支付金额不足");

}

}

}

// App层:协调领域对象

public OrderPaymentDTO pay(OrderPayCmd cmd) {

OrderDO order = orderRepo.findById(cmd.getOrderId());

order.validatePayment(); // 调用领域方法 return OrderConverter.toDTO(order); // 转DTO

}

优点:业务高内聚,适合复杂规则系统

缺点:转换层级多,开发成本高

三、高效转换工具

手动转换对象?效率低且易错!

苏三在这里推荐三大利器。

3.1 MapStruct:编译期代码生成

原理:APT注解处理器生成转换代码

示例:PO转DTO

@Mapper

public interface UserConverter {

UserConverter INSTANCE = Mappers.getMapper(UserConverter.class);

@Mapping(source = "createTime", target = "registerDate")

UserDTO poToDto(UserPO po);

}

// 编译后生成UserConverterImpl.java

public class UserConverterImpl {

public UserDTO poToDto(UserPO po) {

UserDTO dto = new UserDTO();

dto.setRegisterDate(po.getCreateTime()); // 自动赋值!

return dto;

}

}

优点:零反射损耗,性能接近手写代码

开源地址:https://github.com/mapstruct/mapstruct

3.2 Dozer + Lombok:注解驱动转换

组合方案:

Lombok:自动生成getter/setter

Dozer:XML/注解配置字段映射

// Lombok注解

@Data

public class UserVO {

private String userId;

private String userName;

}

// 转换配置

userId

id

适用场景:字段名不一致的复杂转换

3.3 手动Builder模式:精细控制

适用场景:需要动态构造的VO

public class OrderVOBuilder {

public OrderVO build(OrderDTO dto) {

return OrderVO.builder()

.orderNo(dto.getOrderNo())

.amount(dto.getAmount() + "元") // 动态拼接

.statusText(convertStatus(dto.getStatus()))

.build();

}

}

四、避坑指南

坑1:PO直接返回给前端

// 致命错误:暴露数据库敏感字段!

public UserPO getUser(Long id) {

// 返回的PO包含password

return userDao.findById(id);

}

解决方案:

使用DTO过滤字段

注解屏蔽:@JsonIgnore

坑2:DTO中嵌入业务逻辑

public class OrderDTO {

// 错误!DTO不应有业务方法

public void validate() {

if (amount < 0)

throw new Exception();

}

}

本质错误:混淆DTO与BO的职责

坑3:循环嵌套转换

// OrderVO中嵌套List

public class OrderVO {

// 嵌套对象

private List products;

}

// 转换时触发N+1查询

orderVO.setProducts(order.getProducts()

.stream()

.map(p -> convertToVO(p)) // 循环查询数据库

.collect(toList()));

优化方案:批量查询 + 并行转换

五、如何选择对象模型?

image

总结

关于对象的4个核心原则:

单一职责:

PO只存数据,BO只管业务,VO只负责展示——绝不越界!

安全隔离:

PO永不出DAO层(防数据库泄露)

VO永不出Controller(防前端逻辑污染服务)

性能优先:

大对象转换用MapStruct(编译期生成代码)

嵌套集合用批量查询(杜绝N+1)

适度设计:

10张表以内的系统:可用POJO一撸到底

百张表以上核心系统:必须严格分层

对象设计没有银弹,理解业务比套用模式更重要!

当你在为对象命名纠结时,不妨回到业务的起点问一句:“它此刻的核心职责是什么?”

DTO和VO的区别及使用场景详解 DTO(Data Transfer Object)和 VO(Value Object)都是一种设计模式,用于封装数据和提供服务。VO(View Object):视图对象,专门用于前端展示层,专注于表示某个具体的值或对象的对象,包含业务逻辑;VO的作用是将一组数据以适合特定用户界面(UI)的形式封装起来,确保数据的呈现既符合设计要求也满足用户体验标准。例如我们有一个电子商务网站,其中产品详情页需要显示产品的名称、价格、库存、图片等信息。VO会将这些信息以最优化的方式组织起来,供前端展示。 阅读详情

相关推荐

Java后端代码框架包设计-什么是Domain,BO,VO?我们该如何区分和定义?

它可能包含与界面展示相关的数据,比如下拉列表的选项、需要显示在页面上的信息等。可能需要进行一些简单的数据校验,比如非空校验、格式校验等,以确保传递给业务逻辑层的数据是有效的。)不完全一致,它可能只包含实体类的一部分字段,或者包含一些与业务逻辑无关但界面需要展示的数据。可能只包含实体类的一部分字段,或者包含一些额外的、与业务逻辑无关但界面需要展示的数据。通常包含实体类的全部字段,并且可能会根据业务逻辑的需要添加一些额外的字段或属性。通常包含更复杂的业务逻辑校验,比如数据的唯一性校验、关联数据的校验等。

Java程序员专栏 2183

VO和DTO有什么区别?

在Java开发中,VO和DTO都是用于数据传输的对象,但它们的含义和用途有所不同。VO(Value Object)通常是用于表示业务领域中的一个值对象,它是一个纯粹的数据对象,主要用于封装从业务层传递到UI层的数据,以便于UI层展示或者接收用户输入。VO通常不包含业务逻辑,也不会进行数据库操作或者其他复杂的计算,它只负责数据的传输和展示。VO的属性通常是只读的,不允许被修改。

dedede001的博客 1万+

测站坐标系统 -- 东北天(ENU)坐标系、站心坐标系

测站坐标系统以观测站(或地面上某一个观测点为中心建立坐标系统,将这类坐标系称为测站坐标系统。测站坐标系通常以用户所在的位置点P为坐标原点三个坐标轴分别是相互垂直的东向北向和天向,因而测站坐标系又称为东北天(ENU)坐标系。由于测站坐标系以站心为坐标原点,因此也称为站心坐标系。如图所示,测站坐标系的天向与大地坐标系(LLA经纬度坐标系)在此点的高程方向一致。测站坐标系固定在地球上,本质上是一种地固坐标系。(1)以站心为坐标原点。(2)Z轴与站心点的椭球法线重合,向上为正。

qq_43381998的博客 1万+

一文讲清DTO、BO、PO、VO

DTO (Data Transfer Object) 数据传输对象: DTO设计模式用于将数据从服务端传输到客户端,或者在不同的服务之间传递。通常,DTO包含了特定业务场景需要的数据结构,并且不包含任何业务逻辑。它简化了不同服务或模块之间的交互,使得各个层之间的耦合度降低。 BO (Business Object) 业务对象: BO代表了业务逻辑层中的对象,封装了与某个业务相关的数据以及针对这些数据的操作逻辑。一个BO可能由多个实体属性组成,并处理涉及多个实体的复杂业务逻辑。

共同进步,共同学习。 9302

OpenHarmony v4.1 Release设置应用随系统自动启动

OpenHarmony 4.1 版本中的 Ability Manager Service (AMS) 提供了应用自启动管理功能,允许系统控制哪些应用可以在系统启动时自动运行。这需要以下两个主要步骤:启用系统的自启动管理支持开发一个系统应用来管理自启动配置。

afufufufu的博客 1899

<PLC><西门子><工控>西门子博图V18中使用SCL语言编写一个CRC16-modbus校验程序

西门子官方对于SCL语言的介绍如下:SCL 编程语言SCL 编程语言SCL(Structured Control Language,结构化控制语言)是一种基于 PASCAL 的高级编程语言。这种语言基于标准DIN EN 61131-3(国际标准为 IEC 1131-3)。根据该标准,可对用于可编程逻辑控制器的编程语言进行标准化。SCL 编程语言实现了该标准中定义的 ST 语言 (结构化文本) 的PLCopen 初级水平。语言元素。

用沸腾的热血,支付我们的人生吧! 1436

C#实现屏幕墙:同时监控多个电脑桌面(支持Windows、信创Linux、银河麒麟、统信UOS)

最近有不少的客户提到了安防监控等场景,需要满足跨平台、高实时性的多个屏幕的监控需求,用户可在监控端实时查看多个被监控电脑屏幕的内容,即类似屏幕墙的需求。于是,我用C#实现了一个屏幕墙Demo分享给大家。该Demo解决方案一共包括2个项目:服务端、PC客户端,都是基于.NET Core 3.1。监控端运行时主界面如下所示:Demo的主要功能如下:(1)客户端登录时,可以选择登录身份:监控端、被监控端。

jhasjfhgasjkh的博客 945

射频微波电路设计【1.4】

AppCAD是一组射频设计工具和计算机应用说明,它使射频工程师能以更快和更容易的方式设计他们的产品。该软件的理 念是为工程师提供一个“个人设计助理”,即功能强大、快速和容易使用的辅助设计工具。该软件包括如下基本功能: ·各种传输线电气参数的分析与计算;·各种匹配电路的分析与计算;·各种有源和无源简单电路的分析与计算;·射频系统指标的计算:增益、噪声系数、三阶交调、信噪比、灵敏度等;·器件可靠性分析。

qq_43416206的博客 2322

诳C#实现屏幕墙:同时监控多个电脑桌面(支持Windows、信创Linux、银河麒麟、统信UOS)R

var source = new UserArray { Name = "VIP", Users = [new User { Id = 1, Name = "Jxj" }, new User { Id = 2, Name = "张三" }] };User[] source = [new User { Id = 1, Name = "Jxj" }, new User { Id = 2, Name = "张三" }];全局配置应在使用所有Mapper实例之前配置,对已经完成初始化的Mapper实例无效。

IkP0v4j4g的博客 341

【五分钟论文笔记】Vision Banana:图像生成器成为通用视觉学习器

图像生成训练可以像 LLM 预训练一样,让模型学习强大且通用的视觉表示感知即生成——将视觉任务输出参数化为 RGB 图像,是一种优雅且强大的统一框架视觉理解能力可以在不牺牲生成能力的情况下获得——两者可以共存于同一个模型。

专注:太空算力、AI infra、异构调度、大模型成本工程 232

基于Python的船舶AIS数据爬取与分析:从数据采集到可视化实战

本文详细介绍了如何使用Python构建一个完整的船舶AIS数据爬取与分析系统。文章从AIS系统的基本原理讲起,逐步深入到数据采集、存储、清洗、分析和可视化的全流程。我们将使用最新的Python技术栈,包括aiohttp异步爬虫、MongoDB存储、Pandas数据处理以及Pydeck三维可视化等。本文提供了完整的代码实现,并探讨了在实际应用中可能遇到的问题及其解决方案。关键词:AIS数据、Python爬虫、异步IO、数据可视化、海事分析。

2201_76125261的博客 811

浅析VO、DTO、DO、PO、POJO区别

传统规范图 另一种规范图 整体流程 用户发出请求(可能是填写表单),表单的数据在展示层被匹配为VO。 展示层把VO转换为服务层对应方法所要求的DTO,传送给服务层。 服务层首先根据DTO的数据构造(或重建)一个DO,调用DO的业务方法完成具体业务。 服务层把DO转换为持久层对应的PO(可以使用ORM工具,也可以不用),调用持久层的持久化方法,把PO传递给它,完成持久化操作。 对于一个逆向操作,如读取数据,也是用类似的方式转换和传递,略。 VO(Value Object)值对象 视图对象,用于展示层,

骑个小蜗牛的博客 2万+

STM32G0/G4无刷电机硬件设计与FOC控制实现

无刷直流电机(BLDC)和永磁同步电机(PMSM)的矢量控制依赖于高精度电流采样、实时SVPWM调制与闭环PI调节等核心技术。其底层实现需兼顾电机本体建模、坐标变换(Clark/Park)、死区补偿及硬件资源约束。STM32G0系列凭借CORDIC协处理器与超低功耗特性,适用于成本敏感型有感FOC应用;而STM32G4集成运放、FMAC滤波器与高级定时器,可支撑高性能无感控制与多源传感融合。该技术广泛应用于机器人关节、智能云台、伺服驱动等场景,是嵌入式电机控制工程师必须掌握的工程化落地能力。

weixin_35751412的博客 121

【 VO(视图模型) 与 DTO(数据传输对象)的区别】

DTO 和 VO 的属性值基本是一致的,而且他们通常都是 json对象,因此没必要多此一举,但不要忘记这是实现层面的思维,对于设计层面来说,概念上还是应该存在 VO 和 DTO ,因为两者有着本质的区别,DTO 代表服务层需要接收的数据和返回的数据,而 VO 代表展示层需要显示的数据。通常的做法是:DTO模型C中包含领域模型A对应的DTO模型A和领域模型B对应的DTO模型B,然后在服务端,分别把DTO模型A和DTO模型B通过AutoMapper转换成领域模型A和领域模型B。VO转换成DTO同理。...

oDJMoney的博客 4252

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

一文理解什么是DTO、VO、BO、PO、DO,并推荐一款IDEA转换插件

1、什么是DTO、VO、BO、PO、DO、POJO POJO的定义是无规则简单的对象,在日常的代码分层中pojo会被分为VO、BO、 PO、 DTO。通过各层POJO的使用,有助于提高代码的可读性和可维护性。 概念看似简单,但是想区分好或者理解好也不容易,本文简单梳理一下。 DTO(Data Transfer Object)数据传输对象 在服务间的调用中,传输的数据对象 个人理解,DTO是可以存在于各层服务中(接口、服务、数据库等等)服务间的交互使用DTO来解耦 VO (view object

Java开发,人工智能,边缘计算,致力于掌握前沿技术 2万+

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

浅析VO、DTO、DO、PO的概念、区别和用处

概念: VO(View Object):视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来。 DTO(Data Transfer Object):数据传输对象,这个概念来源于J2EE的设计模式,原来的目的是为了EJB的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的性能和降低网络负载,但在这里,我泛指用于展示层与服务层之间的数据传输对象。 DO(Domain Object):领域对象,就是从现实世界中抽象出来的有形或无形的业务实体。 PO(Persiste

YHJ 3万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

VO、DTO、DO、POJO的区别和概念

1、概念: VO(View Object):视图对象,用于页面展示层,它的作用是把某个指定页面(或组件)的数据封装起来,传输到前端页面上。 DTO(Data Transfer Object):数据传输对象,主要用于展示层与服务层之间的数据传输。 DO(Domain Object):领域对象(或称实体对象),就是从现实世界中抽象出来的有形或无形的业务实体。 POJO(Plain Ordina...

林晓风的博客 6954

PO,BO,VO,DTO区别

开发过程中,遇到不同的封装,有DTO,BO,VO使用的时候容易混淆,分不清楚使用场景,查阅资料弄懂了

wozaichengduha的博客 4368

VO和DTO的区别

VO和DTO的区别

昭晟 1万+

Java架构中VO、DTO、DO、BO的区别与联系(超详解)

VO、DTO、DO、BO是分层架构中的不同对象,每个对象在各自的层次中承担着不同的角色,各自有自己的特点和用途。在实际开发中,要根据业务需求和架构要求,灵活使用这些对象,使得系统的耦合性和复杂度得到合理的控制和降低。

weixin_52533007的博客 7755

对 PO、BO、DTO、VO 的理解

一、概念 PO【persistant object】 持久对象,对应数据库的表。 BO【persistant object】 业务对象,将业务逻辑封装成一个对象。可以理解为 PO 的组合,例如:我们可以以教育经历、工作经验、社会关系作为 PO,将这三者封装成一个简历(BO)。 DTO【Data Transfer Object】 数据传输对象,用在需要跨进程或远程传输时,不包含业务逻辑。DTO 可以隐藏 server 端的表结构,例如:一个 PO 100 个属性,DTO 只返回其中的 10 个属性。客户端如

cab5的博客 9538

Java学习笔记——实体类(ENTITY,VO,DTO,BO)

最近在写代码的时候,对于Entity、VO、DTO、BO的概念有些混淆,不太了解具体的用途以及作用,所以想梳理一下。 阿里巴巴Java开发手册中的分层领域模型规约: DO(Data Object):此对象与数据库表结构一一对应,通过 DAO层向上传输数据源对象。 DTO(Data Transfer Object):数据传输对象,Service 或Manager 向外传输的对象。 BO(Business Object):业务对象,可以由Service层输出的封装业务逻辑的对象。 Query:数据查询对象,

Alicia 5万+
上一篇: 粕RAG 架构地基工程-Retrieval 模块的系统设计分享I
下一篇: 咽从零实现基于扩散模型的文本到视频生成系统:技术详解与Pytorch代码实现U
普通网友
博客等级 码龄1年 37粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值