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

pojovoDto等概念

Java 中的数据模型概念

POJO (Plain Old Java Object)

POJO 是最简单的 Java 对象,不依赖于特定的框架,不实现任何特殊的接口,也不继承特定的类。

特点

  • 具有无参构造函数
  • 属性使用 private 修饰
  • 提供公共的 getter 和 setter 方法
  • 可序列化

示例

public class User {private Long id;private String username;private String email;// 无参构造函数public User() {}// getter和setter方法public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}
}

应用场景

  • 作为基础的数据模型
  • 实体类映射数据库表
  • 作为其他数据模型的基础

DTO (Data Transfer Object)

DTO 是一种设计模式,用于在不同层之间传输数据,特别是在远程调用中减少网络传输次数和数据量。

特点

  • 只包含数据,没有业务逻辑
  • 可以组合多个领域对象的属性
  • 可以隐藏部分属性,只传输必要的数据
  • 减少服务间的耦合度

示例

public class UserDTO {private Long id;private String username;// 注意这里没有包含敏感信息如密码// 构造函数、getter和setterpublic UserDTO() {}public UserDTO(Long id, String username) {this.id = id;this.username = username;}// getter和setter方法public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}
}

应用场景

  • 微服务之间的数据传输
  • 前后端数据交互
  • 跨系统集成

VO (Value Object / View Object)

VO 有两种常见的理解:

  1. Value Object:表示一个不可变的值对象,用于表达领域概念
  2. View Object:更常见的理解,用于展示层,包含了视图渲染所需的数据

特点(View Object 视角)

  • 针对特定视图定制的数据结构
  • 可能组合多个不同对象的属性
  • 可能包含额外的显示逻辑
  • 只包含展示所需的数据

示例

public class UserProfileVO {private String username;private String avatarUrl;private Integer postCount;private List<String> roles;// 构造函数、getter和setterpublic UserProfileVO() {}// getter和setter方法public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getAvatarUrl() {return avatarUrl;}public void setAvatarUrl(String avatarUrl) {this.avatarUrl = avatarUrl;}public Integer getPostCount() {return postCount;}public void setPostCount(Integer postCount) {this.postCount = postCount;}public List<String> getRoles() {return roles;}public void setRoles(List<String> roles) {this.roles = roles;}
}

应用场景

  • 返回给前端的响应数据
  • 视图模板的数据支持
  • 页面特定的数据结构

PO (Persistent Object)

PO 是映射到数据库表的 Java 对象,通常与 ORM 框架一起使用。

特点

  • 与数据库表结构一一对应
  • 每个属性对应表中的一个字段
  • 通常使用 ORM 注解进行映射
  • 不包含业务逻辑

示例

@Entity
@Table(name = "users")
public class UserPO {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Column(name = "username", nullable = false, length = 50)private String username;@Column(name = "email", nullable = false, unique = true)private String email;@Column(name = "password_hash", nullable = false)private String passwordHash;@Column(name = "created_at")private Date createdAt;// 构造函数、getter和setter// ...
}

应用场景

  • 数据库操作
  • ORM 映射
  • 持久化层的主要对象

BO (Business Object)

BO 是封装业务逻辑的对象,处理业务规则和流程。

特点

  • 包含业务逻辑和规则
  • 可能组合多个 PO 对象
  • 可能包含验证、计算等业务处理
  • 通常在服务层使用

示例

public class UserRegistrationBO {private String username;private String email;private String password;private String confirmPassword;// 业务逻辑方法public boolean validatePasswordMatch() {return password != null && password.equals(confirmPassword);}public boolean validateEmail() {// 邮箱格式验证逻辑return email != null && email.matches("^[\\w-\\.]+@([\\w-]+\\.)+[\\w-]{2,4}$");}// 转换为PO对象public UserPO toUserPO() {UserPO userPO = new UserPO();userPO.setUsername(username);userPO.setEmail(email);userPO.setPasswordHash(hashPassword(password));userPO.setCreatedAt(new Date());return userPO;}private String hashPassword(String password) {// 密码哈希逻辑return "hashed_" + password; // 示例,实际应使用安全的哈希算法}// getter和setter// ...
}

应用场景

  • 业务逻辑处理
  • 业务规则验证
  • 业务流程控制

各类型对象之间的转换

在实际应用中,不同类型的对象之间经常需要进行转换,例如:

// PO转DTO
public UserDTO convertToDTO(UserPO userPO) {UserDTO dto = new UserDTO();dto.setId(userPO.getId());dto.setUsername(userPO.getUsername());return dto;
}// DTO转VO
public UserProfileVO convertToVO(UserDTO dto, UserStatDTO statDTO) {UserProfileVO vo = new UserProfileVO();vo.setUsername(dto.getUsername());vo.setAvatarUrl("/avatars/" + dto.getId() + ".jpg");vo.setPostCount(statDTO.getPostCount());return vo;
}

通常会使用工具库如 MapStruct、ModelMapper 或 BeanUtils 来简化这些转换工作。

多层架构中的应用

在典型的三层或多层架构中,各类型对象的应用如下:

  1. 数据访问层:使用 PO 与数据库交互
  2. 业务逻辑层:使用 BO 处理业务,DTO 在服务间传输数据
  3. 表示层:使用 VO 向前端提供数据

示例流程

  1. 控制器接收前端请求,可能包含请求 DTO
  2. 服务层处理业务逻辑,使用 BO
  3. 数据访问层使用 PO 操作数据库
  4. 服务层将结果转换为 DTO 返回给控制器
  5. 控制器将 DTO 转换为 VO 返回给前端

最佳实践

  1. 正确分层:明确各类对象的职责和使用场景
  2. 避免过度设计:根据项目复杂度选择合适的模型
  3. 转换工具:使用成熟的对象映射工具减少样板代码
  4. 命名规范:统一命名规范,如 UserPO、UserDTO、UserVO 等
  5. 保持简单:小项目可以适当简化,不必创建所有类型的对象

相关文章:

pojovoDto等概念

Java 中的数据模型概念 POJO (Plain Old Java Object) POJO 是最简单的 Java 对象&#xff0c;不依赖于特定的框架&#xff0c;不实现任何特殊的接口&#xff0c;也不继承特定的类。 特点 具有无参构造函数属性使用 private 修饰提供公共的 getter 和 setter 方法可序列化 …...

COdeTop-206-反转链表

题目 206. 反转链表 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1]示例 …...

线段树讲解(小进阶)

目录 前言 一、线段树知识回顾 线段树区间加减 区间修改维护&#xff1a; 区间修改的操作&#xff1a; 区间修改update&#xff1a; 线段树的区间查询 区间查询&#xff1a; 区间查询的操作&#xff1a; 递归查询过程&#xff1a; 区间查询query&#xff1a; 代码&…...

4082P 信号/频谱分析仪

——新利通仪器仪表—— 4082P丨信号/频谱分析仪 2Hz&#xff5e;110GHz Ceyear 4082系列信号/频谱分析仪在显示平均噪声电平、相位噪声、互调抑制、动态范围、幅度精度和测试速度等方面具备极佳的射频性能。具备强大的频谱分析、符合标准的功率测量套件、I/Q分析、瞬态分析…...

夏季跑步注意

夏季跑步注意 医学专家警示&#xff1a;大众跑者需以安全为先&#xff0c;警惕高温环境下“盲目冲刺”的风险。一些事件再次印证马拉松适宜气温为6-15℃&#xff0c;超过20℃时需主动降速并增加补水量。 所以建议每一位跑友&#xff0c;为了健康的跑步&#xff0c;每年除了做…...

openharmony5.0.0中C++公共基础类测试-线程相关(一)

C公共基础类测试及源码剖析 延续传统&#xff0c;show me the code&#xff0c;除了给出应用示例还重点分析了下openharmony中的实现。 简介 openharmony中提供了C公共基础类库&#xff0c;为标准系统提供了一些常用的C开发工具类&#xff0c;本文分析其实现&#xff0c;并给…...

TDengine 数据订阅设计

简介 数据订阅作为 TDengine 的一个核心功能&#xff0c;为用户提供了灵活获取所需数据的能力。通过深入了解其内部原理&#xff0c;用户可以更加有效地利用这一功能&#xff0c;满足各种实时数据处理和监控需求。 基本概念 主题 与 Kafka 一样&#xff0c;使用 TDengine 数…...

python:mido 提取 midi文件中某一音轨的音乐数据

pip install mido 使用 mido库可以方便地处理 MIDI 文件&#xff0c;提取其中音轨的音乐数据。 1.下面的程序会读取指定的 MIDI 文件&#xff0c;并提取指定编号音轨的音乐数据&#xff0c;主要包括音符事件等信息。 编写 mido_extract.py 如下 # -*- coding: utf-8 -*- &…...

vue3 中推荐使用的页面布局方式

1、Flexbox布局 原理 Flexbox&#xff08;弹性盒子布局模型&#xff09;提供了一种更加高效的方式来对容器中的子元素进行布局、对齐和分配空间。它能够根据容器的大小和子元素的内容自动调整布局&#xff0c;非常适合一维布局&#xff08;水平或垂直方向&#xff09;。 优…...

URP-UGUI交互功能实现

一、非代码层面实现交互&#xff08;SetActive&#xff09; Button &#xff1a;在OnClick&#xff08;&#xff09;中添加SetActive方法&#xff08;但是此时只首次有效&#xff09; Toggle &#xff1a;在OnClick&#xff08;&#xff09;中添加动态的SetActive方法 &#…...

UniGoal 具身导航 | 通用零样本目标导航 CVPR 2025

UniGoal的提出了一个通用的零样本目标导航框架&#xff0c;能够统一处理多种类型的导航任务 &#xff08;如对象类别导航、实例图像目标导航和文本目标导航&#xff09;&#xff0c;而无需针对特定任务进行训练或微调。 它的特点是 图匹配与多阶段探索策略&#xff01;&#x…...

通过Quartus II实现Nios II编程

目录 一、认识Nios II二、使用Quartus II 18.0Lite搭建Nios II硬件部分三、软件部分四、运行项目 一、认识Nios II Nios II软核处理器简介 Nios II是Altera公司推出的一款32位RISC嵌入式处理器&#xff0c;专门设计用于在FPGA上运行。作为软核处理器&#xff0c;Nios II可以通…...

Linux/AndroidOS中进程间的通信线程间的同步 - IPC方式简介

前言 从来没有总结过Linux/Android系统中进程间的通信方式和线程间的同步方式&#xff0c;这个专栏就系统总结讨论一下。首先从标题可知&#xff0c;讨论问题的主体是进程和线程、通信和同步&#xff1b;在这里默认你理解进程和线程的区别。通信和同步有什么概念上的区别&…...

Windows:注册表配置应用

0、简介 本篇博客记录一下&#xff0c;日常的系统注册表配置选项&#xff0c;以防再次遇到问题不知如何解决。 1、开机启动配置 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run :: 此位置存储了所有用户登录时需要启动的程序。 在该项下新建字符串值&#…...

升级xcode16之后react-native-zip-archive不兼容,unsupported option ‘-G‘

问题 升级xcode到16之后,xcode build报错:unsupported option -G for target x86_64-apple-ios13.4-simulator (in target RNZipArchive from project Pods) 出现原因 在 React Native 项目中,当你将 Xcode 升级到 16 后,可能会遇到 RNZipArchive 相关的编译错误,特别是…...

WebXR教学 05 项目3 太空飞船小游戏

准备工作 自动创建 package.json 文件 npm init -y 安装Three.js 3D 图形库&#xff0c;安装现代前端构建工具Vite&#xff08;用于开发/打包&#xff09; npm install three vite 启动 Vite 开发服务器&#xff08;推荐&#xff09;&#xff08;正式项目开发&#xff09; …...

网页在浏览器中显示的原理(简要)

网页在浏览器中显示的过程是一个复杂的多阶段流程。 1. 输入URL并发起请求 用户在地址栏输入URL并回车 浏览器检查缓存&#xff08;DNS缓存、页面缓存等&#xff09; 如果没有缓存&#xff0c;通过DNS解析获取服务器IP地址 建立TCP连接&#xff08;三次握手&#xff09; 发…...

rl中,GRPO损失函数详解。

文章目录 **一、GRPO损失函数的设计背景****二、代码逐行解析****三、关键组件详解****1. 对数概率与KL散度计算****2. 优势值与策略梯度****3. 掩码与平均损失****四、训练动态与调参建议**在TRL(Transformer Reinforcement Learning)库中,GRPO(Group Relative Policy Opt…...

【Java面试笔记:基础】12.Java有几种文件拷贝方式?哪一种最高效?

在 Java 中,文件拷贝可以通过多种方式实现,不同方式的性能和适用场景有所差异。 1. Java 文件拷贝方式 传统 IO 方式 使用 FileInputStream 和 FileOutputStream,通过循环读取和写入数据实现文件拷贝。 示例代码: try (InputStream is = new FileInputStream("sou…...

【leetcode】3524 求出数组的X值1

题目链接 题目描述 给你一个正整数数组 nums 和一个正整数 k。 你可以对数组执行一次操作&#xff1a;移除不重叠的前缀和后缀&#xff08;可以为空&#xff09;&#xff0c;留下一个连续非空子数组。 对于每一种留下的子数组&#xff0c;计算&#xff1a; (该子数组的乘积…...

达梦统计信息收集情况检查

查询达梦某个对象上是否有统计信息 select id,T_TOTAL,N_SMAPLE,N_DISTINCT,N_NULL,BLEVEL,N_LEAF_PAGES,N_LEAF_USED_PAGES,LAST_GATHERED from sysstats where id IN (select id from sysobjects where upper(name)upper(&objname));可能有系统对象&#xff0c;可以增加…...

1️⃣5️⃣three.js_GUI辅助调试器

15、GUI辅助调试器 3D虚拟工厂在线体验 GUI辅助调试器将原本需要修改代码调整参数并刷新页面的操作,简化为直接在GUI中实时调整,实现所见即所得的效果。 导入GUI 库 //引入GUI辅助调试器 import {GUI } from three/addons/libs/lil-gui.module.min.js创建GUI辅助调试器对象 c…...

【matlab】气泡图的应用

【matlab】气泡图的应用 .rtcContent { padding: 30px; } .lineNode {font-size: 12pt; font-family: "Times New Roman", Menlo, Monaco, Consolas, "Courier New", monospace; font-style: normal; font-weight: normal; } clear load zb_equi.mat load …...

@Configuration注解对应实现implements WebMvcConfigurer的配置不生效问题。

检查项目是否有其他配置实现了 extends WebMvcConfigurationSupport&#xff0c;如果有就是这个配置导致实现implements WebMvcConfigurer的配置不生效。 我的问题项目有imgconfig&#xff0c;和webconfig Configuration public class ImgConfig extends WebMvcConfigurationS…...

飞帆控件:在编辑模式下额外加载的库

飞帆是一个自由的控件设计平台。在飞帆中&#xff0c;我们可以很方便地创建基于 Vue 2 组件的控件&#xff0c;并使用控件来搭建网页。 他山之石&#xff0c;可以攻玉。在创建控件中&#xff0c;使用 js 、css 依赖库能让我们的控件更强大。 有些时候&#xff0c;在编辑模式下…...

【k8s】docker、k8s、虚拟机的区别以及使用场景

一、Docker &#xff08;一&#xff09;概念 Docker 是一个开源的应用容器引擎&#xff0c;允许开发者将应用及其依赖打包到一个可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可实现虚拟化。 &#xff08;二&#xff09;隔离性 Docker 的隔离…...

Super-Vlan和MUX-Vlan的原理、配置、区别

Super-Vlan 原理 Super-Vlan也叫Aggregate-Vlan。 一般的三层交换机中&#xff0c;通常是采用一个VLAN对应一个vlanif接口的方式实现广播域之间的互通&#xff0c;这在某些情况下导致了IP地址的浪费。因为一个VLAN对应的子网中&#xff0c;子网号、子网定向广播地址、子网缺…...

Docker容器化技术全栈指南:从基础运维到企业级实践

Docker容器化技术全栈指南&#xff1a;从基础运维到企业级实践 一、Docker核心价值与日常运维全景 1. 容器化革命性优势 维度传统虚拟化Docker容器启动速度分钟级&#xff08;完整OS引导&#xff09;秒级&#xff08;共享内核&#xff09;资源消耗每个VM需独立OS&#xff08;…...

Python 赋能区块链教育:打造去中心化学习平台

Python 赋能区块链教育:打造去中心化学习平台 引言 区块链技术正在重塑全球多个行业,而教育领域也不例外。传统的在线学习平台往往依赖中心化存储和管理模式,导致数据安全、用户隐私、资源共享等问题难以解决。而随着 Web 3.0 的发展,区块链在教育场景中的应用逐渐受到关…...

el-table怎么显示 特殊单元格的值

1. 在 el-table-column 上绑定了 formatter 方法 formatEntityName &#xff0c;它会对每一行该列的数据&#xff08; cellValue &#xff09;进行处理。 2. 在 formatEntityName 方法中&#xff0c;尝试对传入的 cellValue 进行 JSON.parse 操作&#xff0c;并根…...