DAO和DTO的区别

DAO:

data access object数据访问对象 
主要用来封装对数据库的访问。通过它可以把POJO持久化为PO,用PO组装出来VODTO 

DTO:

Data Transfer Object数据传输对象 
主要用于远程调用等需要大量传输对象的地方。 

DAO 数据访问对象:用来封装对数据库的访问,通过它可以将数据库中的表转化为DTO类

比如我们一张表有100个字段,那么对应的PO就有100个属性。
但是我们界面上只要显示10个字段,
客户端用WEB service来获取数据,没有必要把整个PO对象传递到客户端,
这时我们就可以用只有这10个属性的DTO来传递结果到客户端,这样也不会暴露服务端表结构.到达客户端以后,如果用这个对象来对应界面显示,那此时它的身份就转为VO

### DAO模式与DTO模式的概念 #### 数据访问对象 (DAO, Data Access Object) DAO是一种设计模式,旨在通过封装底数据库操作逻辑来简化数据访问的设计。它提供了统一的接口供上业务调用,从而屏蔽了具体的数据存储细节[^1]。这种方式使得应用程序可以更加灵活地应对不同的数据源变化。 #### 数据传输对象 (DTO, Data Transfer Object) 相比之下,DTO主要用于解决分布式系统中的性能瓶颈问题。它的核心目的是减少网络通信次数以及降低带宽消耗。通常情况下,在客户端服务端交互过程中,会创建一个专门的对象用来承载所需传递的信息集合——这就是所谓的“胖对象”,即包含了个属性值的一个实体类实例[^2]。 --- ### 主要区别 | 特性 | DAO | DTO | |--------------------|-----------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------| | **主要功能** | 提供对持久化机制的操作接口 | 负责在不同组件之间交换数据 | | **关注点** | 如何高效、安全地完成增删改查等基础CRUD操作 | 怎样最小化远程调用开销并保持清晰简洁的数据结构 | | **适用范围** | 局限于同一进程内的数据存取控制 | 广泛应用于跨服务边界的场景 | 从上述格可以看出两者虽然都涉及到软件架构面的重要组成部分,但是它们各自侧重点完全不同:前者更偏向于是面向资源管理;后者则是为了满足远距离通讯需求所诞生的一种解决方案. 另外值得注意的是,在实际开发当中我们往往会发现这两种技术并非孤立存在而是相辅相成的关系。例如当采用微服务体系构建大型项目时,可能就需要先利用DAO去处理本地事务然后再借助DTO把结果返回给外部请求方。 --- ### 应用场景分析 对于需要频繁进行复杂查询或者大量更新的企业级应用来说,单独依靠传统的SQL语句显然不够理想,此时引入DAO能够极大地提高可维护性扩展能力。与此同时如果考虑到系统的整体吞吐量,则应该考虑适当增加一些轻量化版本的结果集示形式也就是我们的DTOs,这样既可以保留原有逻辑又不会因为过冗余字段拖累效率。 以下是两种典型的应用案例: - 当某个电商平台想要展示商品列页面的时候,后台可以通过DAO加载必要的产品详情信息,并组装成为适合前端渲染所需的紧凑型JSON格式响应体(即DTO),最终发送出去。 - 另外在一个跨国团队协作平台里头,为了避免每次同步状态都要重新拉取整个用户档案资料库的内容,我们可以预先定义好只包含关键变更项的小规模载体作为中间媒介来进行周期性的增量刷新动作。 ```java // 示例代码片段展示了如何结合使用DAODTO public class ProductDao { public List<Product> getProducts() { ... } // 使用DAO获取原始数据 } @Data @AllArgsConstructor @NoArgsConstructor public class ProductDto implements Serializable{ private String name; private double price; } @Service public class ProductService { @Autowired private ProductDao productDao; public List<ProductDto> fetchProductDtos(){ List<Product> products = this.productDao.getProducts(); return products.stream() .map(p -> new ProductDto(p.getName(), p.getPrice())) .collect(Collectors.toList()); } } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值