Java分层开发必知:PO、BO、DTO、VO、POJO概念详解

目录

  • 引言
  • 一、核心概念与定义
    • 1、PO(Persistent Object,持久化对象)
    • 2、BO(Business Object,业务对象)
    • 3、DTO(Data Transfer Object,数据传输对象)
    • 4、VO(View Object,视图对象)
    • 5、POJO(Plain Ordinary Java Object,简单Java对象)
  • 二、对比与区别
    • 1、表格对比
    • 2、关键区别
    • 3、流转图
  • 总结

引言

  在Java企业级开发中,我们经常会遇到POJO、PO、DTO、BO、VO等各种对象概念,这些看似相似的术语常常让开发者感到困惑。本文将深入解析这些核心概念的区别与联系,并通过代码示例展示它们在实际项目中的正确使用方式。


一、核心概念与定义

1、PO(Persistent Object,持久化对象)

  • 定义PO与数据库表结构一一对应,每个字段映射表中的一列,通常由ORM框架(如MyBatis、Hibernate)自动生成
  • 作用:用于数据持久化操作,如增删改查(CRUD),仅包含数据,不涉及业务逻辑

MyBatis示例

@Table(name = "t_user")
public class UserPO {@Idprivate Long userId;private String userName;// 其他字段...
} 

2、BO(Business Object,业务对象)

  • 定义:BO封装业务逻辑,可由多个PO组合而成,包含复杂的业务操作(如数据校验、流程控制)
  • 特点
    • 独立于具体存储方式,可操作数据库、缓存、外部接口等
    • 例如,订单BO可能包含用户PO、商品PO和支付信息PO

示例场景

public class OrderBO {private OrderPO order;private List<ItemPO> items;private UserPO user;public BigDecimal calculateTotal() {// 复杂的计算逻辑...}
}

3、DTO(Data Transfer Object,数据传输对象)

  • 定义:DTO用于不同层之间的数据传输,尤其是Service层与Controller层的交互。它可以根据需求封装部分字段,减少不必要的数据传输
  • 特点
    • 可能包含多个PO的组合或裁剪后的字段(例如从30个字段中选取10个传输)
    • 支持序列化,常用于远程调用(如RPC、HTTP接口)
    • 无业务逻辑

典型场景

public class UserDTO {private String displayName;private LocalDateTime registerTime;// 转换方法public static UserDTO fromPO(UserPO po) {// 转换逻辑...}
}

4、VO(View Object,视图对象)

  • 定义:VO是展示层(前端页面)直接使用的对象,仅包含前端需要展示的数据,通常以JSON形式返回
  • 应用场景:Controller层将数据封装为VO后传递给前端,避免暴露敏感字段(如密码、内部状态)

示例

public class UserVO {private String formattedDate;private String userLevel;// 可能包含组合字段...
}

5、POJO(Plain Ordinary Java Object,简单Java对象)

  • 定义:POJO是所有简单Java对象的统称,VO、DTO、PO等均属于POJO
  • 特点:仅包含属性及Getter/Setter方法,不依赖特定框架

二、对比与区别

1、表格对比

对象应用场景特点
PO数据库交互与数据库表严格对应
BOService层内部业务逻辑封装复杂业务逻辑,可包含多个PO的组合
DTOService层与Controller层间聚合业务所需数据,可能组合多个PO
VOController层与前端交互按前端需求定制字段

2、关键区别

  • PO vs DTO:PO严格映射数据库表,DTO可根据业务需求裁剪字段
  • DTO vs VO:DTO关注传输效率,VO关注展示效果。例如,DTO可能包含敏感字段(如用户ID),而VO仅展示脱敏后的信息
  • BO vs PO:BO包含业务逻辑,PO仅存储数据。例如,订单BO可能计算总价,而订单PO仅记录金额

3、流转图

数据库
DAO层
Service层
Controller层
前端/客户端
PO
BO
DTO
VO

查询用户信息并返回给前端

  1. DAO层通过UserDAO查询数据库,返回UserPO
  2. Service层将UserPO转换为UserDTO,过滤敏感字段
  3. Controller层将UserDTO转换为UserVO,添加前端需要的格式化字段(如日期字符串)

总结

  合理使用VO、DTO、PO和BO等对象能有效实现解耦、提高灵活性和安全性。VO保护敏感数据DTO适配不同接口需求PO确保数据持久化准确BO封装复杂业务逻辑。在开发中,根据项目复杂度选择合适的对象类型,并统一团队规范,提升代码可读性和可维护性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/pingmian/84601.shtml

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

相关文章

Linux下OLLAMA安装卡住怎么办?

网络环境不理想&#xff0c;经常在官方的linux安装脚本执行时卡住&#xff0c;其实主要是下载文件卡住&#xff0c;于是我想到了是否可以把其中下载的过程显化、分步&#xff0c;这样更可控&#xff0c;于是修改了官方的install.sh #!/bin/sh # This script installs Ollama o…

C++面试(5)-----删除链表中指定值的节点

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 给定一个单向链表的头节点 head 和一个特定值 val&#xff0c;要求编写一个函数来删除链表中所有值等于 val 的节点&#xff0c;并返回修改后的链表头节点。 示例&#xff1a; 输…

如何用AI赋能学习

由于博主是大学生&#xff0c;今天花费了大量的时间去进行期末的复习&#xff0c;不过从复习中得到了一些学习的灵感&#xff0c;即&#xff1a;如何用AI赋能学习 当我们需要掌握一门新的技能的时候&#xff0c;我们很容易的想到三种办法&#xff1a;买书自己学&#xff0c;报…

【threejs】每天一个小案例讲解:常见材质

代码仓 GitHub - TiffanyHoo/three_practices: Learning three.js together! 可自行clone&#xff0c;无需安装依赖&#xff0c;直接liver-server运行/直接打开chapter01中的html文件 运行效果图 知识要点 1. MeshBasicMaterial&#xff08;基础网格材质&#xff09; • 特…

springboot后端与鸿蒙的结合

软件&#xff1a;鸿蒙devceo3.1&#xff0c;springboot项目采用IDEA 目的&#xff1a; 1、结合springboot后端与鸿蒙的结合运用。 2、Log日志查看console语句的信息。 3、引入 import http from ohos.net.http。 4、调用springboot后端提供的链接发送post 5、TextInput的…

minio集群通过mc mirror命令进行定时备份,支持X86和arm两种架构

文章目录 前言一、思路二、使用步骤1.下载mc二进制文件2.手动测试备份命令3.配置定时任务4.成功截图 总结 前言 通过mc mirror命令对minio集群进行定时备份。 一、思路 通过mc mirror命令配合crond定时任务进行周期性的备份 二、使用步骤 1.下载mc二进制文件 wget https:…

三大能力升级,为老项目重构开辟新路径

在软件技术飞速迭代的今天&#xff0c;老项目重构是开发者们绕不开的难题。接口实现缺失、业务逻辑矛盾、架构规划偏离等问题如同拦路虎&#xff0c;让重构工作举步维艰。而传统的 AI 辅助方式&#xff0c;因未充分关联项目实际情况&#xff0c;犹如 “空中造楼”&#xff0c;难…

AES加密

AES加密算法详解 AES&#xff08;Advanced Encryption Standard&#xff09;是一种对称密钥分组加密算法&#xff0c;用于保护电子数据的安全性。其核心特点是通过相同的密钥进行加密和解密&#xff0c;属于对称加密体系。。以下从核心特性、加密流程及安全性三方面展开说明&a…

关于联咏(Novatek )自动曝光中Lv值的计算方式实现猜想

目录 一、常见Lv对应的实际场景 二、常见光圈值 三、最小二乘法计算SV中的系数K

[docker]镜像操作:关于docker pull、save、load一些疑惑解答

在使用 Docker 的过程中&#xff0c;镜像管理是极其重要的一环。无论是拉取、保存还是加载镜像&#xff0c;每一个步骤都可能遇到一些疑问或者误区。 本文将结合实际案例&#xff0c;对常见的 Docker 镜像操作问题进行系统性总结&#xff0c;帮你更好地理解 Docker 镜像的工作机…

SFTrack:面向警务无人机的自适应多目标跟踪算法——突破小尺度高速运动目标的追踪瓶颈

【导读】 本文针对无人机&#xff08;UAV&#xff09;视频中目标尺寸小、运动快导致的多目标跟踪难题&#xff0c;提出一种更简单高效的方法。核心创新在于从低置信度检测启动跟踪&#xff08;贴合无人机场景特性&#xff09;&#xff0c;并改进传统外观匹配算法以关联此类检测…

什么是渗透测试,对网站安全有哪些帮助?

在网络安全的战场中&#xff0c;网站如同暴露在数字世界的堡垒&#xff0c;时刻面临着黑客攻击的威胁。而渗透测试&#xff0c;就像是为网站进行一场 “模拟攻防演练”&#xff0c;它以黑客的思维和手段&#xff0c;主动出击&#xff0c;探寻网站潜在的安全漏洞。究竟什么是渗透…

KU115LPE-V10型FPGA加速卡

KU115LPE-V10是一款基于PCI Express总线通信的FPGA加速类产品。 该产品基于Xilinx公司的的高性能Kintex Ultra-Scale FPGA设计&#xff0c;配置最大两组DDR4缓存单元&#xff0c;每组最大支持4GB容量&#xff0c;72bit&#xff08;包含ECC&#xff0c;8bit&#xff09;&#x…

【笔记】Blockchain

区块链Blockchain是一种分布式数据库技术&#xff0c;其核心特点在于去中心化、不可篡改和透明性。它通过一系列按照时间顺序排列的数据块&#xff08;即“区块”&#xff09;组成&#xff0c;每个数据块都包含了一定时间内的一系列信息交易&#xff0c;并通过密码学方法确保这…

GitHub Desktop Failure when receiving data from the peer

目录 安装Github Desktop简易省流助手 解决 Git 克隆时出现的 "Failure when receiving data from the peer" 错误1. 网络连接问题原因&#xff1a;解决办法&#xff1a; 2. Git 配置问题原因&#xff1a;解决办法&#xff1a; 3. GitHub 服务故障原因&#xff1a;解…

疏锦行Python打卡 DAY 27 函数专题2:装饰器

def logger(func):def wrapper(*args, **kwargs):print(f"开始执行函数 {func.__name__}&#xff0c;参数: {args}, {kwargs}")result func(*args, **kwargs)print(f"函数 {func.__name__} 执行完毕&#xff0c;返回值: {result}")return resultreturn wr…

大模型布署如何选择GPU资源?

当前主流GPU型号及其显存大小&#xff08;显存“大小”&#xff09;的详细分类汇总&#xff0c;结合消费级、专业工作站级及数据中心级三大应用场景&#xff0c;数据综合自行业常用型号及最新产品信息&#xff08;截至2025年6月&#xff09;&#xff1a; &#x1f3ae; 一、消费…

目标检测——YOLOv12算法解读

论文&#xff1a;YOLOv12: Attention-Centric Real-Time Object Detectors (2025.2.18) 作者&#xff1a;Yunjie Tian, Qixiang Ye, David Doermann 链接&#xff1a;https://arxiv.org/abs/2502.12524 代码&#xff1a;https://github.com/sunsmarterjie/yolov12 YOLO系列算法…

JavaEE-Maven

maven Maven是⼀个项⽬管理⼯具, 通过pom.xml⽂件的配置获取jar包&#xff0c;⽽不⽤⼿动去添加jar包。 maven简单, ⽅便, 提⾼我们的开发效率, 减少我们的开发Bug。 IDEA本⾝已经集成了Maven, 我们可以直接使⽤, ⽆需安装。 创建maven项目 name是项目名 location是项目路径 …

使用 C/C++的OpenCV 实时播放火柴人爱心舞蹈动画

使用 C/OpenCV 实时播放火柴人爱心舞蹈动画 本文将介绍如何使用 C/OpenCV 库实时创建一个动画窗口&#xff1a;一个火柴人捧着爱心跳舞&#xff0c;同时另一个爱心从远处飞来并逐渐变大。动画会实时在 OpenCV 窗口中播放&#xff0c;直到用户按下按键退出。 准备工作 确保你…