DAO(数据访问对象:Data Access Object) 和 ORM(对象关系映射:Object-Relational Mapping)的区别与联系

发布于:2025-09-13 ⋅ 阅读:(16) ⋅ 点赞:(0)
DAO(一种设计模式)
ORM(可作为DAO的具体实现)


在软件开发中, DAO(Data Access Object)ORM(Object-Relational Mapping) 是两个经常被提及但作用不同的概念。理解它们之间的区别,有助于我们在架构设计中更好地组织代码、提高系统的可维护性和扩展性。


一、基本定义

1. ORM(对象关系映射)

ORM 是一种技术或框架,它的核心作用是将数据库中的表映射为程序中的类(对象),并提供一种面向对象的方式来操作数据库。例如,通过一个 User 类来表示 users 表,通过类的属性来访问字段,通过方法调用实现增删改查等操作。

✅ ORM 是底层技术,关注的是如何将数据库表结构映射为对象模型,并自动生成 SQL 语句。

2. DAO(数据访问对象)

DAO 是一种设计模式,其核心目标是封装对数据库的访问逻辑,为上层业务逻辑提供统一的数据操作接口。它通常通过类和方法的形式实现,例如 UserDAO 提供 get_by_id, add 等方法。

✅ DAO 是上层架构设计模式,关注的是如何组织和封装数据库操作逻辑,不关心底层如何实现。


二、核心区别

特性 ORM DAO
类型 技术/框架 设计模式
目标 将数据库表映射为对象,简化 SQL 操作 封装数据库访问逻辑,解耦业务与数据层
抽象层次 更底层,处理数据模型与数据库的映射 更高层,提供统一的接口供业务层调用
职责范围 生成 SQL、执行查询、映射结果 定义操作方法、事务管理、异常处理
是否必须 可选(也可以直接使用 SQL) 建议使用,提高代码结构清晰度
典型框架/库 SQLAlchemy、SQLModel、Django ORM 自定义类(如 UserDAOImpl

三、协同工作关系

ORM 和 DAO 并不是对立的,而是可以协同工作

- ORM 是 DAO 的实现工具:DAO 层通常会使用 ORM 提供的模型类来操作数据库,例如:

class UserDAOImpl(UserDAO):
    def get_by_id(self, user_id: int) -> Optional[User]:
        with self.Session() as session:
            return session.query(User).filter(User.id == user_id).first()

其中 User 是由 ORM 定义的模型类。

- DAO 是 ORM 的上层封装:ORM 提供了基础操作能力,而 DAO 负责组织这些能力,形成业务逻辑所需的数据访问接口,例如批量处理、事务控制等。


四、何时使用 DAO?

虽然 ORM 已经可以完成大部分数据库操作,但引入 DAO 层有以下优势:

- 解耦业务逻辑与数据库操作:业务代码无需关心 SQL 或 ORM 细节。

- 提高代码复用性:通用的 DAO 方法可以在多个业务场景中复用。

- 便于测试与维护:DAO 可以被独立测试,便于后期重构。

- 统一异常处理与事务管理:集中处理数据库连接、提交、回滚等逻辑。


五、总结

ORM DAO
技术/框架,用于对象化数据库操作 设计模式,封装数据库访问逻辑
提供基础的 SQL 生成与执行能力 提供统一的接口和业务逻辑适配
是 DAO 可以利用的底层工具 是业务逻辑与数据访问之间的桥梁
更关注“怎么操作数据库” 更关注“谁来操作数据库”和“如何组织这些操作”

✅ 总结一句话:

ORM 是“怎么操作数据库”,DAO 是“谁来操作数据库”。ORM 是实现 DAO 的一种手段,而 DAO 是组织数据库访问逻辑的一种设计模式。二者相辅相成,共同构建出清晰、可维护的数据访问架构。