Java 中,DAO 返回的查询结果用 DTO 封装还是 PO 封装?
跳到导航
跳到搜索
一般来说,Persistent Object (PO) 通常用于映射数据库中的数据,一个 PO 准确对应数据库的一张表没什么问题,
dao.save(po)、.delete()、 .update()、 .list(),PO 都够用,
让我困惑的是,实际应用场景中更多的是查询结果需要一个各个属性对应的多个字段来自多张表的对象,这个对象并不是和数据库中的某一张表的某条数据对应的关系,
那么应该怎么处理这种情况?
在 Java 中,推荐使用 Data Transfer Object (DTO) 封装 DAO 返回的查询结果。
DTO 专门用于封装数据并在不同的层之间传递,而 Persistent Object (PO) 通常用于映射数据库中的数据。
使用 DTO 而不是 PO 可以隔离业务逻辑和数据访问层,降低耦合性,并保证代码的可维护性和可扩展性。
那也就是说,对于单个查询业务的场景(尤其是需求还比较复杂的),可以单独抽象出一个 DAO 负责查询,然后将查询结果封装到一个抽象出来的 DTO 里。
这么看 DAO 确实既可以返回 PO,也应该可以返回 DTO 的。
毕竟如果一个对象的字段并不是对应某一张表的一条数据(比如它是个 group by、sum 统计汇总产生的对象),
那么它本身就不符合 PO Persistent Object 持久化对象的定义,它的存在就是为了封装查询结果的,就是个 DTO data transfer object,数据传输对象。
嗯,这样确实也有利于扩展,而且尤其符合设计模式的 单一职责原则。