随着编程工业化水平的不断加深,各种编程模型层出不穷(比如MVC,MVP等等),伴随着这些编程模型,又有一大批新的概念蜂拥而至,什么VO,BO,PO,DO,DTO之类的,这些新的概念一直以来都是云里雾里,网上虽然也有不少文章来区分这些概念,但看下来基本都是几篇相同的文章转载来转载去,这些文章本身也说的不明,有些还互相矛盾,再加上有些文章在简化系统里面来使用这些概念,让人越看越迷糊
废话不多说,先来看张图
看完图估计大部分人就已经有了一个直观的感受了
在 Java 中,DTO、VO和PO是常见的用于数据传输和表示的概念和模式。它们的含义如下:
- DTO (Data Transfer Object):DTO是用于在不同层之间传输数据的对象。它通常用于将数据从数据库层传输到服务层或传输数据从服务层到表示层。DTO对象包含一些字段,这些字段的类型和名称与源数据对象相对应,但通常不包含业务逻辑。
- DTO(Data Transfer Object)数据传输对象,主要用于远程调用等需要大量传输对象的地方。比如我们一张表有100个字段,那么对应的PO就有100个属性。但是我们界面上只要显示10个字段,客户端用WEB service来获取数据,没有必要把整个PO对象传递到客户端,这时我们就可以用只有这10个属性的DTO来传递结果[1][1] [2][3]
例子:
public class UserDTO {
private String username;
private String email;
// Getter and setter methods
}
- VO (Value Object):VO是一个特定领域中的值对象,它通常用于封装一组相关的数据,并且通常会包含一些业务逻辑。VO对象的字段可以是只读的,也就是说,一旦创建就不能修改。
- VO(View Object)视图对象,主要用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来。VO对象可以包含多个DTO对象[3][2] [4][4]。
例子:
public class UserVO {
private final String username;
private final String email;
// Constructor
public UserVO(String username, String email) {
this.username = username;
this.email = email;
}
// Getter methods
public String getUsername() {
return username;
}
public String getEmail() {
return email;
}
}
- PO (Persistent Object):PO代表持久化对象,它通常用于与数据库表结构相对应的对象,用于在数据库和数据访问层之间进行数据转换。PO对象包含与数据库表中的列相对应的字段,并且通常具有与数据库操作相关的方法。
- PO(Persistent Object)持久化对象,是一种O/R映射关系,可以看成是数据库表到java对象的映射。PO对象应该只包含和数据库表对应的属性[5][5] [6][6]。
例子:
public class UserPO {
private Long id;
private String username;
private String email;
// Getter and setter methods
}
这些概念的使用可能会根据具体的应用和架构而不同,但通常它们用于实现数据传输、数据封装和数据持久化等功能。
一个简单的示例:
假设我们有一个用户表(user),包含以下字段:
id | name | gender | age | |
---|---|---|---|---|
1 | chang | 1 | 18 | chang@gmail.com |
对应的PO类就是:
public class User {
private int id;
private String name;
private String gender;
private int age;
private String email;
// 省略getter和setter方法
}
假设我们有一个用户列表页面,只需要显示用户的id、name和email,那么我们可以定义一个UserDTO类:
public class UserDTO {
private int id;
private String name;
private String email;
// 省略getter和setter方法
}
假设我们有一个用户详情页面,需要显示用户的所有信息,以及用户所属的部门名称(department),那么我们可以定义一个UserVO类:
public class UserVO {
private UserDTO userDTO;
// 包含用户基本信息
private String department;
// 用户所属部门名称
// 省略getter和setter方法
}
最后再来一张图,帮助理解一下吧
参考: