“Java 中,DAO 返回的查询结果用 DTO 封装还是 PO 封装?”的版本间的差异

来自姬鸿昌的知识库
跳到导航 跳到搜索
(建立内容为“1”的新页面)
 
第1行: 第1行:
1
+
一般来说,Persistent Object (PO) 通常用于映射数据库中的数据,一个 PO 准确对应数据库的一张表没什么问题,
 +
 
 +
dao.save(po)、.delete()、 .update()、 .list(),PO 都够用,
 +
 
 +
让我困惑的是,实际应用场景中更多的是查询结果需要一个各个属性对应的多个字段来自多张表的对象,这个对象并不是和数据库中的某一张表的某条数据对应的关系,
 +
 
 +
那么应该怎么处理这种情况?
 +
 
 +
 
 +
以下是 chatgpt 的回答:
 +
 
 +
在 Java 中,推荐使用 Data Transfer Object (DTO) 封装 DAO 返回的查询结果。
 +
 
 +
DTO 专门用于封装数据并在不同的层之间传递,而 Persistent Object (PO) 通常用于映射数据库中的数据。
 +
 
 +
使用 DTO 而不是 PO 可以隔离业务逻辑和数据访问层,降低耦合性,并保证代码的可维护性和可扩展性。
 +
 
 +
 
 +
那也就是说,对于单个查询业务的场景(尤其是需求还比较复杂的),可以单独抽象出一个 DAO 负责查询,然后将查询结果封装到一个抽象出来的 DTO 里,
 +
 
 +
DAO 可以不止操作 PO,还可以封装 DTO。
 +
 
 +
 
 +
嗯,这样确实也有利于扩展,而且尤其符合设计模式的 单一职责原则。

2023年2月7日 (二) 22:37的版本

一般来说,Persistent Object (PO) 通常用于映射数据库中的数据,一个 PO 准确对应数据库的一张表没什么问题,

dao.save(po)、.delete()、 .update()、 .list(),PO 都够用,

让我困惑的是,实际应用场景中更多的是查询结果需要一个各个属性对应的多个字段来自多张表的对象,这个对象并不是和数据库中的某一张表的某条数据对应的关系,

那么应该怎么处理这种情况?


以下是 chatgpt 的回答:

在 Java 中,推荐使用 Data Transfer Object (DTO) 封装 DAO 返回的查询结果。

DTO 专门用于封装数据并在不同的层之间传递,而 Persistent Object (PO) 通常用于映射数据库中的数据。

使用 DTO 而不是 PO 可以隔离业务逻辑和数据访问层,降低耦合性,并保证代码的可维护性和可扩展性。


那也就是说,对于单个查询业务的场景(尤其是需求还比较复杂的),可以单独抽象出一个 DAO 负责查询,然后将查询结果封装到一个抽象出来的 DTO 里,

DAO 可以不止操作 PO,还可以封装 DTO。


嗯,这样确实也有利于扩展,而且尤其符合设计模式的 单一职责原则。