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

Java开发中的vo,dto,po

a1f3b40392a842ed923f3c8a5e16966a.png

1. DTO (Data Transfer Object) - 数据传输对象

  • 定义:DTO 是用于传输数据的对象,通常在服务层与表现层之间传递数据。

  • 用途:DTO 通常用于减少网络传输的数据量,因为它只包含需要传递的数据,而不包含业务逻辑。DTO 常用于不同服务或系统之间的数据交换。

  • 特点

    • 包含的数据是从其他对象(通常是 PO)中提取出来的。
    • 仅用于传输,不包含业务逻辑。
    • 可能对数据进行一定的裁剪或合并,以适应不同的传输需求。
  • 示例

    public class UserDTO {
        private Long id;
        private String username;
        private String email;
        // 可能还包含其他的传输相关字段
        // Getters and Setters
    }
    

     

2. VO (Value Object) - 值对象

  • 定义:VO 是表示一个抽象的业务对象或视图的数据对象,通常用于表现层与业务逻辑层之间。

  • 用途:VO 通常在表示层(如前端)使用,表示一个具体的业务场景中的数据结构,可能是多个领域对象或实体对象的组合。

  • 特点

    • 一般表示一个不变的数据结构,或者说它的属性一旦创建就不再变化。
    • 与具体的业务逻辑有更紧密的联系。
    • 用于表现层的数据封装,通常直接在前端显示。
  • 示例

    public class UserVO {
        private String username;
        private String displayName;
        // 可能包含一些展示相关的信息,比如角色、权限等
        // Getters and Setters
    }
    

     

3. PO (Persistent Object) - 持久化对象

  • 定义:PO 是与数据库表结构一一对应的 Java 对象,用于表示数据库中的一行记录。

  • 用途:PO 通常用于数据持久化操作,是业务数据与数据库之间的映射对象。通过 ORM 框架(如 Hibernate)将 PO 对象与数据库表关联。

  • 特点

    • 直接映射到数据库表结构,通常对应于数据库中的一张表。
    • 包含数据库字段的所有属性。
    • 可能包括一些与数据库相关的注解或映射信息。
  • 示例

    @Entity
    @Table(name = "users")
    public class UserPO {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
    
        @Column(name = "username")
        private String username;
    
        @Column(name = "password")
        private String password;
    
        @Column(name = "email")
        private String email;
    
        // Getters and Setters
    }
    
    

       假设我们有一个用户管理系统,其中有以下几个主要操作:

  • 用户注册:用户通过 Web 表单提交注册信息。
  • 用户信息展示:在页面上显示用户的信息。
  • 数据库操作:将用户信息持久化存储到数据库中。

    1. PO (Persistent Object) - 持久化对象

    PO 对象直接映射到数据库中的 users 表,用于持久化操作。

     
import javax.persistence.*;

@Entity
@Table(name = "users")
public class UserPO {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "username", nullable = false, unique = true)
    private String username;

    @Column(name = "password", nullable = false)
    private String password;

    @Column(name = "email", nullable = false, unique = true)
    private String email;

    @Column(name = "created_at")
    private LocalDateTime createdAt;

    // Getters and Setters
    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 getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public LocalDateTime getCreatedAt() {
        return createdAt;
    }

    public void setCreatedAt(LocalDateTime createdAt) {
        this.createdAt = createdAt;
    }
}

 

 

 

2. DTO (Data Transfer Object) - 数据传输对象

DTO 对象用于在用户注册时,接收和传输用户输入的数据。它通常只包含必要的字段,不包括业务逻辑。

public class UserDTO {

    private String username;
    private String password;
    private String email;

    // Getters and Setters
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

3. VO (Value Object) - 值对象

VO 对象用于在表现层显示用户的信息。它可能与 DTOPO 不同,通常会包含一些额外的展示信息,且不会包含敏感数据(如密码)

public class UserVO {

    private String username;
    private String email;
    private String displayName;
    private LocalDateTime createdAt;

    // Getters and Setters
    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;
    }

    public String getDisplayName() {
        return displayName;
    }

    public void setDisplayName(String displayName) {
        this.displayName = displayName;
    }

    public LocalDateTime getCreatedAt() {
        return createdAt;
    }

    public void setCreatedAt(LocalDateTime createdAt) {
        this.createdAt = createdAt;
    }
}

 

 

4. Service 层示例

Service 层,我们会使用 DTO 对象来接收用户传递的数据,然后将这些数据转化为 PO 对象,最后进行持久化操作。VO 对象用于将持久化后的数据转换为可显示的格式。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    // 注册用户,使用 DTO 来接收数据
    public UserVO registerUser(UserDTO userDTO) {
        UserPO userPO = new UserPO();
        userPO.setUsername(userDTO.getUsername());
        userPO.setPassword(userDTO.getPassword()); // 实际项目中密码应进行加密处理
        userPO.setEmail(userDTO.getEmail());
        userPO.setCreatedAt(LocalDateTime.now());

        // 持久化到数据库
        userPO = userRepository.save(userPO);

        // 将持久化后的数据转换为 VO 对象用于展示
        UserVO userVO = new UserVO();
        userVO.setUsername(userPO.getUsername());
        userVO.setEmail(userPO.getEmail());
        userVO.setCreatedAt(userPO.getCreatedAt());
        userVO.setDisplayName(userPO.getUsername()); // 例如 displayName 可以是用户名加某些前缀等

        return userVO;
    }

    // 根据用户 ID 获取用户信息,并返回 VO 对象
    public UserVO getUserById(Long id) {
        UserPO userPO = userRepository.findById(id).orElseThrow(() -> new RuntimeException("User not found"));

        UserVO userVO = new UserVO();
        userVO.setUsername(userPO.getUsername());
        userVO.setEmail(userPO.getEmail());
        userVO.setCreatedAt(userPO.getCreatedAt());
        userVO.setDisplayName(userPO.getUsername());

        return userVO;
    }
}

 

总结

  • DTO:用于数据传输,通常在服务层与表现层之间传递数据,目的是优化数据传输效率。
  • VO:用于表现层,通常是业务数据的封装,直接用于前端显示。
  • PO:用于持久化,直接与数据库中的表结构对应,是 ORM 框架操作数据库的基础。

 


http://www.kler.cn/a/291245.html

相关文章:

  • CTF知识点总结(二)
  • SQL概述
  • C++ 泛型编程:动态数据类模版类内定义、类外实现
  • Spring Boot教程之五十一:Spring Boot – CrudRepository 示例
  • SpringBoot | @Autowired 和 @Resource 的区别及原理分析
  • IP查询于访问控制保护你我安全
  • 基于 AT 固件测试 ESP32 设备作为 WiFi AP 模式创建 TCP Server 开启 UART-to-WiFi 透传模式的指令序列
  • 航电系统,无人机的核心!!!
  • 彻底改变计算机视觉的 Vision Transformer (ViT) 综合指南(视觉转换器终极指南)
  • 电脑开机出现no operation system found错误原因分析及解决方法
  • SpringBoot 基于iText 根据PDF模板动态生成文件
  • C#笔记6 网络编程基础,解释端口套接字,代码实例分析DNS,IPAddress等类
  • MySQL-进阶篇-锁(全局锁、表级锁、行级锁)
  • Fabric.js全面介绍:强大的交互式图形编辑框架
  • 优化采样参数提升大语言模型响应质量:深入分析温度、top_p、top_k和min_p的随机解码策略
  • 【C++ Qt day6】
  • Codeforces Round 971 (Div. 4) ABCD题详细题解(C++,Python)
  • Mac 安装Hadoop教程(HomeBrew安装)
  • 关于HTTP通讯流程知识点补充—常见状态码及常见请求方式
  • Hive服务部署及Datagrip工具使用
  • ElasticSearch-ELK
  • Linux中的时间
  • Webview Android性能优化
  • 赛题解读!文心智能体大赛招募中
  • SQL进阶技巧:经典问题题-换座位
  • LeetCode376 摆动序列