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 框架操作数据库的基础。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KNeeg_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值