模型类DTO、PO、VO

news2024/11/25 3:02:59

项目中有三类模型类:DTO数据传输对象、PO持久化对象,DTO用于接口层向业务层之间传输数据,PO用于业务层与持久层之间传输数据;有些项目还会设置V0对象,V0对象用在前端与接口层之间传输数据,当前端有多个平台且接口存在差异时就需要设置V0对象用于前端和接口层传输数据。

1. 概念详解

在软件开发中,尤其是分层架构中,我们经常使用 DTO(Data Transfer Object)、PO(Persistent Object)、VO(Value Object)来分别处理数据在不同层之间的传递和转换。这些模型类各自有明确的职责和作用。

1.1 DTO(Data Transfer Object)数据传输对象

作用:DTO 是用于在不同层(通常是 Service 层和 Controller 层)之间传递数据的对象。它主要用来简化数据传输,通常只包含与传输相关的字段,而不是数据库的直接映射。

使用场景

  • 将客户端传递的数据封装为 DTO 后传递到服务层。
  • 服务层处理完业务逻辑后,将结果封装为 DTO 返回给客户端。

1.1.1 示例

public class UserDTO {
    private String username;
    private String email;
    private int age;
    // getters and setters
}

1.1.2 在 Controller 中使用

@RestController
@RequestMapping("/users")
public class UserController {

    @Resource
    private UserService userService;

    @PostMapping
    public ResponseEntity<String> createUser(@RequestBody UserDTO userDTO) {
        userService.createUser(userDTO);
        return ResponseEntity.ok("User created successfully");
    }
}

1.1.3 在 Service 层使用

@Service
public class UserService {

    @Resource
    private UserMapper userMapper;

    public void createUser(UserDTO userDTO) {
        UserEntity userEntity = new UserEntity();
        BeanUtil.copyProperties(userDTO, userEntity);
        userMapper.insert(userEntity);
    }
}

1.2 PO(Persistent Object)持久化对象

作用:PO 是与数据库表直接映射的对象,用于持久化数据。通常会在数据访问层(Mapper 层)使用,代表数据库中的一条记录。

使用场景

  • 从数据库中查询到的数据会被映射为 PO 对象。
  • 需要将数据保存到数据库时,会将 PO 对象传递到数据访问层。

1.2.1 示例

@TableName("users")
public class UserEntity {
    private Long id;
    private String username;
    private String email;
    private int age;
    // getters and setters
}

1.2.2 在 Mapper 层使用

@Mapper
public interface UserMapper extends BaseMapper<UserEntity> {
    // 定义数据库操作的方法
}

1.2.3 在 Service 层使用

@Service
public class UserService {

    @Resource
    private UserMapper userMapper;

    public UserEntity getUserById(Long id) {
        return userMapper.selectById(id);
    }
}

1.3 VO(Value Object)值对象

作用:VO 是用于展示层的数据对象,通常用于向前端返回数据。它可能包含组合的数据,通常是为了封装复杂的数据结构,使前端更容易消费。

使用场景

  • 将多个数据源的数据组合后封装为 VO 对象返回给前端。
  • 用于返回处理后的数据给客户端,通常比 DTO 更加复杂。

1.3.1 示例

public class UserVO {
    private String username;
    private String email;
    private String profileUrl; // 可能是从其他服务获取的头像URL
    // getters and setters
}

1.3.2 在 Service 层使用

@Service
public class UserService {

    @Resource
    private UserMapper userMapper;

    public UserVO getUserVO(Long id) {
        UserEntity userEntity = userMapper.selectById(id);
        UserVO userVO = new UserVO();
        BeanUtil.copyProperties(userEntity, userVO);
        // 假设还有其他服务获取用户的头像URL
        userVO.setProfileUrl("http://example.com/profile/" + id);
        return userVO;
    }
}

1.3.3 在 Controller 中使用

@RestController
@RequestMapping("/users")
public class UserController {

    @Resource
    private UserService userService;

    @GetMapping("/{id}")
    public ResponseEntity<UserVO> getUser(@PathVariable Long id) {
        UserVO userVO = userService.getUserVO(id);
        return ResponseEntity.ok(userVO);
    }
}

2. 总结

2.1 总结与层次使用

  1. DTO(数据传输对象) 用于不同层之间的数据传递,轻量化,字段通常为业务逻辑所需。
  2. PO(持久化对象) 是直接与数据库表对应的实体类,负责数据库操作。
  3. VO(值对象) 是用于前端展示的数据封装,通常包含组合或处理后的数据。

2.2 在项目中,通常的流程是:

  • Controller 层接收前端传来的 DTO,将其传递给 Service 层。
  • Service 层将 DTO 转化为 PO,与数据库交互,并可能会将结果处理后封装为 VO
  • Mapper 层直接操作 PO,执行 CRUD 操作。
  • Service 层在处理完业务逻辑后,将结果封装为 VO,由 Controller 层返回给前端。

这种分层架构使得数据传递清晰明确,层与层之间职责分明,便于维护和扩展。

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

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

相关文章

pr转场预设导入方法怎么操作?

最近很多小伙伴问我一种问题&#xff0c;那就是pr转场预设如何导入&#xff1f;premiere无法导入预设prfpset文件&#xff0c;双击文件导入不行&#xff0c;pr内部点导入文件也不行&#xff0c;显示文件格式不支持&#xff0c;每当遇到这样的问题&#xff0c;同学们都会十分苦恼…

Ubuntu下交叉编译器工具链的安装方法

本篇文章记录Ubuntu下交叉编译器工具链的安装方法。 目录 一、交叉编译器 1、交叉编译器简介 2、获取交叉编译器 3、安装交叉编译器 4、安装相关库 二、结语 一、交叉编译器 1、交叉编译器简介 交叉编译器是一种编译器&#xff0c;它在一种平台上运行&#xff0c;但生成…

爱思唯尔这三个latex模版有什么区别?

这三个模板在大部分内容上是相同的&#xff0c;主要的区别在于它们处理引用和参考文献的方式。这三种模板分别对应不同的文献引用需求&#xff0c;这通常是根据目标期刊的具体要求来决定的&#xff1a; Harvard style&#xff08;elsarticle-template-harv.tex&#xff09;&…

超详细!!!electron-vite-vue开发桌面应用之数据全局状态管理pinia配置(八)

云风网 云风笔记 云风知识库 在这个项目中采用pinia进行全局状态管理 Pinia符合直觉的 Vue.js 状态管理库 ‌Pinia和‌Vuex的主要区别如下&#xff1a; 架构设计 Vuex采用了集中式的架构&#xff0c;将所有的状态存储在一个单一的全局状态树中&#xff0c;通过‌mutations和…

第三届IEEE云计算、大数据应用与软件工程国际学术会议 (IEEE-CBASE 2024,10月11-13)

第三届IEEE云计算、大数据应用与软件工程国际学术会议 ( CBASE 2024 &#xff09;将于2024年10月11—13日在中国杭州举办。 该会议在连续两届成功举办的基础上&#xff0c;本届将由浙江水利水电学院、浙江省自动化学会、浙江省科协智能制造学会联合体主办&#xff0c;浙江水利水…

三十七、【人工智能】【机器学习】【监督学习】- AdaNet算法模型

系列文章目录 第一章 【机器学习】初识机器学习 第二章 【机器学习】【监督学习】- 逻辑回归算法 (Logistic Regression) 第三章 【机器学习】【监督学习】- 支持向量机 (SVM) 第四章【机器学习】【监督学习】- K-近邻算法 (K-NN) 第五章【机器学习】【监督学习】- 决策树…

【Linux】自主编写简单shell

目录 一、C文件接口 二、系统文件I/O 1 .接口介绍 2 .open函数返回值 3 . 文件描述符fd 4 . 文件描述符的分配规则 5 .重定向 6 .使用 dup2 系统调用 7 .FILE 三、缓冲区 一、C文件接口 写文件&#xff1a; #include <stdio.h> #include <string.h> int main(…

Allegro如何调整PCB颜色亮度?

在用Allegro进行PCB设计时,有时候打开别人的PCB板或Demo板,然后在此基础上设计,但发现颜色太亮太刺眼了,不太习惯,那如何调整PCB的亮度呢? PCB板颜色的显示亮度太亮。如下图 下面详细介绍具体设置的方法: 1、选择菜单栏Display→Color/Visibility(颜色/可见度) 2、跳出…

SpringBoot3 + Flowable7 工作流引擎使用笔记

目录 Flowable 简介流程设计器安装使用 SpringBoot 3 整合表结构流程部署启动流程流程审批流程挂起和激活任务分配固定分配表达式分配值表达式方法表达式 监听器分配 流程变量运行时变量历史变量 身份服务候选人拾取任务归还任务指派给别人候选人组创建用户创建用户组用户关联用…

startData

某音startData 记得加入学习群&#xff1a; python爬虫&js逆向3 714283180

贝壳财报解读:彰显韧性,下场拿地,迈向新周期

众所周知&#xff0c;当前我国房地产行业已经迈入“存量房时代”&#xff0c;相比“大扩张时代”&#xff0c;更偏细水长流型&#xff0c;也为贝壳这类“科技驱动的一站式新居住服务平台”&#xff0c;提供了发展舞台。 日前&#xff0c;贝壳披露2024年第二季度财报&#xff1…

第40课 Scratch入门篇:绘制围棋棋盘

绘制围棋棋盘 故事背景: 作为一个围棋手,要有一个好的棋盘才行,让我们来设计一个属于自己的棋盘吧! 程序原理: 这节课的原理很简单,就是通过x,y坐标的偏移来画线,难度就是坐标点的设置,其实坐标用的习惯了,这块也不复杂,让我们一起开始学习! 开始编程 1、删除预…

鸿蒙Text部分文字变色

工具类&#xff1a; export class TextUtil {public static readonly REGEX_B_S "<B>"public static readonly REGEX_B_E "</B>"/*** 获取高亮字符串列表* param str 原始字符串*/public static getHlList(str ?: string, regex ?: strin…

【docker】Dockerfile练习

1、overlay文件系统原理测试 cd /mnt mkdir A B C worker merged echo "From A">./A/a.txt echo "From A">./A/b.txt echo "From A">./A/c.txt echo "From B">./B/a.txt echo "From B">./B/d.txt echo &quo…

smallpdf: 免费高效的PDF水印添加工具

引言 在数字文档管理和分享的过程中&#xff0c;保护版权和确保文档的原创性变得尤为重要。PDF文件作为一种广泛使用的格式&#xff0c;经常需要添加水印来表明所有权或提醒查看者注意文档的敏感性。本文将介绍一款名为smallpdf的免费工具&#xff0c;它能够轻松地为PDF文件添…

第41课 Scratch入门篇:显示声波图形

显示声波图形 故事背景: 电脑的麦克风可以收到各种声音,我们来看看,通过图形把麦克风的声音显示出来,设计一个绘制声音的声波图形 程序原理: 这节课的原理很简单,就是通过x,y坐标的偏移来画线,难度就是坐标点的设置,其实坐标用的习惯了,这块也不复杂,让我们一起开始…

R是一种强大的编程语言和环,你为何还需要RStudio?

下面内容摘录自《R 语言与数据科学的终极指南》专栏文章的部分内容&#xff0c;每篇文章都在 5000 字以上&#xff0c;质量平均分高达 94 分&#xff0c;看全文请点击下面链接&#xff1a; 2章1节&#xff1a;R和RStudio的下载和安装&#xff08;Windows 和 Mac&#xff09;_r…

机器学习深度学习中的Warmup技术是什么?

机器学习&深度学习中的Warmup技术是什么&#xff1f; 在机器学习&深度学习模型的训练过程中&#xff0c;优化器的学习率调整策略对模型的性能和收敛性至关重要。Warmup是优化器学习率调整的一种技术&#xff0c;旨在改善训练的稳定性&#xff0c;特别是在训练的初期阶…

netCDF文件读写处理

1.什么是 NetCDF&#xff1f; NetCDF 是一组软件库和自描述、独立于机器的数据格式&#xff0c;支持创建、访问和共享面向数组的科学数据。NetCDF 由Unidata开发和维护。Unidata 提供用于地球科学教育和研究的数据和软件工具。Unidata 是大学大气研究公司 ( UCAR ) 社区计划 (…

遗传算法与深度学习实战(4)——遗传算法详解与实现

遗传算法与深度学习实战&#xff08;4&#xff09;——遗传算法详解与实现 0. 前言1. 遗传算法简介1.1 遗传学和减数分裂1.2 类比达尔文进化论 2. 遗传算法的基本流程2.1 创建初始种群2.2 计算适应度2.3 选择、交叉和变异2.4算法终止条件 3. 使用 Python 实现遗传算法3.1 构建种…