DTO与POJO核心关联与区别
1. POJO(Plain Old Java Object)
- 本质:简单、纯粹的Java对象
- 核心特征 :
- 不继承特定框架父类
- 不实现特定框架接口
- 不含框架特定注解
- 仅含属性及getter/setter方法
- 目的 :
- 提高代码可移植性
- 增强可测试性
- 简化对象模型
- 常见类型 :
- JavaBean:无参构造器 + 可序列化 + 属性私有化
- Entity :带持久化注解的POJO(如JPA的
@Entity
)
2. DTO(Data Transfer Object)
- 本质:数据传输设计模式
- 核心特征 :
- 纯数据结构(无业务逻辑)
- 扁平化/聚合数据结构
- 按场景定制字段
- 目的 :
- 减少网络调用次数
- 解耦领域模型与外部接口
- 数据安全裁剪(隐藏敏感字段)
对比关系表
特性 | POJO(广义概念) | DTO(具体应用) |
---|---|---|
本质 | 编码风格/对象类型 | 设计模式 |
目的 | 创建框架无关对象 | 高效跨层传输数据 |
业务逻辑 | 可包含 | 严禁包含 |
使用场景 | 全层级(DAO/Service等) | 表现层⇄服务层 |
字段结构 | 严格对应业务模型 | 按客户端需求定制 |
继承关系 | 可存在层级结构 | 通常独立扁平化 |
代码示例
// Entity (POJO)
@Entity
public class User {
@Id private Long id;
private String username;
private String password; // 敏感字段
}
// DTO (POJO实现)
public class ArticleListDto {
private Long articleId;
private String title;
private String authorName; // 安全字段
public ArticleListDto(Article article) {
this.articleId = article.getId();
this.title = article.getTitle();
this.authorName = article.getAuthor().getUsername(); // 过滤密码
}
}
// Controller应用
@GetMapping
public List<ArticleListDto> getArticles() {
return articleService.findAll().stream()
.map(ArticleListDto::new) // 实体转DTO
.toList();
}
核心总结
-
包含关系
✅ 所有DTO都是POJO
❌ 非所有POJO都是DTO
-
本质差异
- POJO强调对象简单性
- DTO强调数据传输使命
-
最佳实践
使用DTO隔离Entity与前端接口,实现:
- 🔒 数据安全性(敏感字段过滤)
- ⚡ 传输高效性(字段按需加载)
- 🧱 架构解耦性(领域模型独立演化)