什么是VO、DTO、Entity

252 阅读3分钟

什么是VO、DTO、Entity

在项目当中,我们经常会看到类似于UserVO.javaUserDTO.javaUserEntity.java这样的类,这些类都是用来表示用户的,但是他们的作用是不一样的,下面我们来看看他们的区别。

DTO (Data Transfer Object)

举一个荔枝 :point_up: UserInfoDTO.java

@Getter
public class UserInfoDTO {
    private String token;
}

DTO是前端传递给后端的数据,和 VO类似,但是DTO是用来传递数据的,而VO是用来展示数据的。DTO一般是由前端传递给后端的,所以DTO里面不会存在业务逻辑。不同的业务场景,DTO也会有不同的实现,比如UserLoginDTO.javaUserRegisterDTO.java等等。UserInfoDTO只有一个属性token,我们获取用户信息就只需要一个token就可以了,所以这个类就是用来获取用户信息的。

再举一个荔枝 :point_up::point_up: UserLoginDTO.java

@Getter
@Setter
public class UserLoginDTO {
    private String username;
    private String password;
}

:point_up::point_up:UserRegisterDTO.java

@Getter
@Setter
public class UserRegisterDTO {
    private String username;
    private String password;
    private String email;
    private String phone;
}

VO (Value Object)

:point_up::point_up::point_up: UserInfoVO.java

@Getter
@Setter
public class UserInfoVO {
    private String uid;
    private String username;
    private String email;
    private String phone;
    private String avatar;
}

这个类的的作用主要是用来给前端展示使用的,也就是说,这个类是前端需要的,所以在这个类里面也不会存在业务逻辑。不同的VO对应着不同的使用场景,不难看出UserInfoVo.java就是通过token获取信息之后返回给前端的用户信息。类似的还有UserListVO.javaUserDetailVO.java等等,这就是VO的作用。

Entity

:point_up::point_up::point_up::point_up: UserEntity.java

@Getter
@Setter
public class UserEntity {
    private String uid;
    private String username;
    private String password;
    private String email;
    private String phone;
    private String avatar;
    private String createTime;
    private String updateTime;
    private String deleted;

    // ...
}

正如我们所看到的,Entity里是包含了一个User的很多信息,但在DTO或VO不需要一些字段,比如passwordcreateTimeupdateTimedeleted等等,一般用于业务层和数据访问层(DAO)之间的数据传递,相当于领域模型中的一个实体,通常包含业务数据和一些相关操作方法。

::: info 与数据库交互有一个PO(持久化对象),与数据库中的表结构相对应,通常每个 PO 对象对应着关系型数据库中的一张表。 :::

总结

不同点使用场景数据结构使用方式
VO一般用于展示数据只包含需要传输的数据字段只使用基本类型和封装类型作为数据成员
DTO一般用于服务层和控制层之间的数据传输只包含需要传输的数据字段只使用基本类型和封装类型作为数据成员
PO用于数据库持久化操作一般与数据库表相对应,包含表中的所有字段可以包含其他 PO 或 Entity 对象作为其成员变量
Entity用于业务层和数据访问层(DAO)之间的数据传递一般与数据库表相对应,包含表中的所有字段可以包含其他 PO 或 Entity 对象作为其成员变量

::: tip 以上来自个人理解,如有错误,欢迎指正。 :::