数据访问对象

在计算机软件中，数据访问对象（data access object，DAO）是为某种类型的数据库或其他持久性机制提供一个抽象介面的对象。通过映射应用程序对持久层的调用，DAO提供一些特定的数据操作，而无需暴露数据库细节。这种隔离支持单一功能原则。它分离了应用程序需要访问哪些数据，就域特定对象和数据类型（DAO的公共接口），而言，这些需求可以用数据库管理系统（DBMS）、数据库模式等满足（DAO的实现）。

尽管这种设计模式同样适用于以下内容：1、大多数编程语言；2、有持久化需求的大多数软件类型；3、大多数数据库。它在传统上与Java EE应用程序和关系数据库相关（通过JDBC API访问，因为它源于Sun Microsystems的最佳实践指南，该平台的“核心J2EE模式”）。

 优点 
使用数据访问对象的优点是应用程序的两个重要部分之间相对简单并严格分离，它们可以但不应该彼此了解任何东西，并且两者可预期的频繁和独立发展。改变业务逻辑可以依赖于相同的DAO接口，而对持久性逻辑的更改只要接口保持正确实现，就不会影响DAO客户端。存储的所有细节都隐藏在应用程序的其余部分中（见）。因此，可以修改一个DAO实现而不影响应用程序的其余部分，从而可能实现对持久性机制的更改。DAO充当了应用程序与数据库之间的中介，它们在对象与数据库记录之间来回转移数据。用取代DAO可以促进代码的单元测试，使测试不依赖于持久层。

在Java编程语言的非特定上下文中，数据访问对象作为一项设计概念可以用多种方式实现。这可以将应用程序中的数据访问部分分离为非常简单的接口，迁移到框架或商业产品。DAO编码范例可能需要一些技巧。像是和Enterprise JavaBeans之类的技术已内置在应用程序服务器中，可以在JavaEE应用程序服务器的应用程序中使用。商业产品如TopLink可以在基于对象关系映射（ORM）的产品上使用。流行的开源ORM产品包括Doctrine (PHP)、Hibernate、iBATIS，以及JPA实现（例如）。

 缺点 
使用DAO的潜在缺点包括抽象泄漏、代码重复和。尤其是将DAO作为常规Java对象的抽象会隐藏每个数据库访问的高成本，并且可能强迫开发人员触发多个数据库查询来检索普通SQL查询中一次就可取回的信息。如果一个应用程序需要多个DAO，人们可能发现自己对每个DAO重复基本上相同的创建、读取、更新和删除代码。不过，也可以实现一个处理常用操作的通用DAO来避免样板化代码。See http://www.ibm.com/developerworks/java/library/j-genericdao/index.html  for workarounds

 工具和框架 
  基于ODB编译器的对象关系映射（ORM）系统，适用于C++
 轻量级对象关系映射（ORM）框架，以Java编写，适用于JDBC和Android
 Microsoft Entity Framework
 DBIx::Class 对象关系映射（ORM）模型，适用于Perl
 ObjectiveSql  基于ActiveRecord 封装的ORM 框架，以Java编写

 参见 
增刪查改（CRUD）
 数据访问层
 服务数据对象
 数据映射器模式

 参考资料 

 外部链接 
 Java Persistence - The DAO Design Pattern 
 PHP best practices (Use Data Access Objects (DAO)) 

Category:软件设计模式