文章目录

  • 1. DTO简介
  • 2. 到底什么是DTO?
  • 3. 将DTO用作POJO
  • 4. Java 中使用DTO的例子
  • 5. 反例: 滥用DTO
  • 6. 小结
  • 相关链接

DTO, 全称为 Data Transfer Object, 我们一般称之为: 数据传输对象。

1. DTO简介

如今的应用越来越复杂, 大部分都演变成了具有多个层级的大型应用程序,我们需要在不同层之间“传输”数据。
对于需要传输的数据,最好是将其封装到对象中,以便于发送和接收。
DTO类型的对象, 不应该掺杂任何业务逻辑; 只包含获取和设置属性的方法, 以及用于序列化或反序列化的解析器。

2. 到底什么是DTO?

在编程领域,DTO 一般是指封装数据以便在不同进程之间传递数据的对象(比如在一个应用到另一个应用之间)。
在 N 层应用程序(N-tier application)中, DTO类型的对象通常是服务层(Service layer)使用,在该层和控制层之间传输数据。

DTO 基本上是一种面向对象设计模式(OOP design pattern),常用于 Python、C++ 和 Java 等语言环境。
DTO 非常容易维护和更新。

如果想从数据库传输一些信息,但其中包含一些敏感信息,那么我们可以使用 DTO,只传输必要的信息。

关于DTO概念的更多信息,请查看维基百科 数据传输对象。

3. 将DTO用作POJO

POJO是普通Java对象的首字母缩略词(Plain Old Java Object), 目的是为了区分EJB (Enterprise Java Beans)或其他必须处理依赖关系的东西。

POJO的内在含义是指那些没有从任何类继承, 也没有实现任何接口, 更没有被其它框架侵入的Java对象。

到底有多简单呢? 举个例子, 对象里面,某些字段是复杂类型的对象(比如List, Map, 或者自定义类型), 那就叫不简单。

在不同层级或子系统之间传输数据,一般使用 DTO 更为普遍。

我们可以认为所有的 DTO 都是 POJO 对象,但并不是所有的 POJO 都可以是 DTO。

不是 DTO 却是 POJO 的例子,可参考具有业务逻辑的那些类。

关于POJO的更多说明, 可参考: What is a POJO Class

4. Java 中使用DTO的例子

下面我们来看看 Java 中的 DTO 示例。

假设有一个 REST API,从数据库查询并返回一些关于用户的信息。

数据库模型中包含很多我们不想通过 REST API 公开的信息。 为此,我们将使用一个 DTO 来返回关于用户的信息。

下面是与数据库表字段相对应的数据库模型, UserModel。

@Entity
public class UserModel {@Id  @GeneratedValue(strategy = GenerationType.IDENTITY)  private Long id;private String firstName;private String lastName;private String email;private String username;private String password;private String country;private String city;private String address;private String placeName;private String accountNumber;private String socialSecurityNumber;private String postalCode;// Getters and Setters
}

REST API 使用下面的 UserDTO 对象将数据返回给客户端;


public class UserDTO {private String username;private String email;private String place;private String phone;// Getters and Setters
} @RestController
public class UserController {// 自动组装@Autowiredprivate UserService userService;// API接口路径@GetMapping("/users")// response body 实际上由 @RestController 指定了@ResponseBodypublic List<UserDTO> getAllUsers() {// 获取所有用户List <UserDTO> users = userService.getAllUsers();// 返回return users;}
}

这里的层级关系为:


客户端(Client)|      ^|      ||    (DTO)V      |
API层(UserController)|      ^|      ||    (DTO)V      |
服务层(UserService)|      ^|      ||  UserModelV      |
存储层(UserRepository)^|V
数据库(DataBase)

5. 反例: 滥用DTO

虽然这种设计模式很方便也很直观,但很多程序员也可能会犯错。
一种最常见的错误,是滥用DTO, 在任何场合都使用这种模式。
这样会增加很多没用的类,并且很难维护。
建议尽可能精简 Class,并尝试重用现有的类。

当然,也不要走另一种极端: 所有场景都只用一个class。

正如前面提到的,不建议在 DTO 类中包含业务逻辑。

6. 小结

在 Java 生态中, 使用DTO的场景一般是:

  • 一个方法的参数太多
  • 想将多个参数从一层传到另一层
  • 需求随时可能会发生变更, 这些参数或字段经常增增减减
  • 某些数据不想透传

通过本文,我们学习了什么是 DTO、为什么需要使用它、以及在哪种情况下应该使用它,以及一些滥用此设计模式的场景。

相关链接

英文原文:

https://examples.javacodegeeks.com/the-dto-data-transfer-object/

合理使用DTO(Data Transfer Object)相关推荐

  1. Dozer 轻松高效玩转DTO(Data Transfer Object)

    现状 对于分布式系统,需要在不同系统之间传递与转换域对象.因为我们不希望外部公开内部域对象,也不允许外部域对象渗入系统.传统上,数据对象之间的映射通过手工编码(getter/setter)的方式实现, ...

  2. Java DTO(data transfer object)的理解,为什么要用DTO

    DTO即数据传输对象. 现状 对于分布式系统,需要在不同系统之间传递与转换域对象.因为我们不希望外部公开内部域对象,也不允许外部域对象渗入系统.传统上,数据对象之间的映射通过手工编码(getter/s ...

  3. 轻松高效玩转DTO(Data Transfer Object)

    点击蓝色"程序猿DD"关注我哟 加个"星标",不忘签到哦 转载自公众号:日拱一兵 关注我,回复口令获取可获取独家整理的学习资料: - 001:领取<Spr ...

  4. WCF Data transfer buffered VS streamed

    WCF Data Transfer buffered VS streamed 在Data Transfer中,我们会经常听到开发提到buffer mode和stream mode.对于不了解Data ...

  5. Error in eval(predvars, data, env) : object ‘**‘ not found

    Error in eval(predvars, data, env) : object '**' not found 目录 Error in eval(predvars, data, env) : o ...

  6. Dao设计模式(Data Access Object)

    目    录(本篇字数:1858) 介绍 通用Dao 一.Dao泛型接口 二.JavaBean 三.Dao接口实现类 四.单元测试 五.反射工具类 介绍 Dao设计模式(Data Access Obj ...

  7. Java Data Access Object Pattern(数据访问对象模式)

    数据访问对象模式(Data Access Object Pattern)或 DAO 模式用于把低级的数据访问 API 或操作从高级的业务服务中分离出来.以下是数据访问对象模式的参与者. 数据访问对象接 ...

  8. 5G NR RLC:Data Transfer ARQ

    其他相关内容 RLC PDU and Parameters RLC架构和RLC entity 一 RLC entity handling RLC entity有建立.重建和释放的过程(establis ...

  9. SAP Hybris和ABAP Netweaver里的DAO(Data access object)

    DAO在Hybris里的定义: A DAO (Data Access Object) is an interface to the storage back end system. DAOs stor ...

最新文章

  1. python乐观锁代码实现_Elasticsearch系列—并发控制及乐观锁实现原理
  2. HTML5:理解head
  3. 常见算法的python实现(Github标星75.5k+)
  4. 网页中的各种高度说明
  5. 正基模组:WIFI/BT/GPS/FM模组列表
  6. Mybatis一对一结果映射
  7. 虚拟机安装服务器2008,VMware Workstation 虚拟机安装64位windows 2008 R2 系统
  8. 手把手教你搭建数据库服务器平台 | DBA VS 自动化运维,究竟谁与争锋?
  9. 二叉搜索树(Binary Search Tree)(Java实现)
  10. linux apache php.ini,Linux Apache的.htaccess控制php.ini 与MIME类型
  11. Hibernate-02-核心配置文件Hibernate.cfg.xml
  12. Android RecyclerView的滚动原理
  13. 技嘉 AORUS Radeon RX 6700 XT ELITE 12G 显示卡潮流登场
  14. 中国社交产品十年记....
  15. Java 简易五子棋
  16. 小程序转uniapp——disabled
  17. ATC系统QNH高度修正(AirNet川大)
  18. reduceByKeyAndWindow基于滑动窗口的热点搜索词实时统计(Scala版本)
  19. requests的session方法
  20. AcrelCloud-3200预付费云平台系统采用智能预付费仪表进行智能预付费远程控制

热门文章

  1. IT兄弟连 Java语法教程 Java平台的版本划分
  2. 【算法】图解A* 搜索算法
  3. 电影记忆之16(人工智能)
  4. 如何借用淘宝巧获海量精准流量?
  5. mysql-MyISAM存储引擎
  6. GRE单词里的大数据和丰富情感,一笑
  7. 什么是深度学习?怎么学好深度学习?
  8. pip及openpyxl安装
  9. 英汉小词典 java_英汉小词典 java随机存取文件流应用 version1.0
  10. verilog 学习笔记1