数据访问对象

软件设计模式

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

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

优点

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

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

缺点

使用DAO的潜在缺点包括抽象泄漏[来源请求]代码重复抽象反演英语Abstraction inversion。尤其是将DAO作为常规Java对象的抽象会隐藏每个数据库访问的高成本,并且可能强迫开发人员触发多个数据库查询来检索普通SQL查询中一次就可取回的信息。如果一个应用程序需要多个DAO,人们可能发现自己对每个DAO重复基本上相同的创建、读取、更新和删除代码。不过,也可以实现一个处理常用操作的通用DAO来避免样板化代码。[2]

工具和框架

参见

参考资料

  1. ^ Core J2EE Patterns - Data Access Objects. Sun Microsystems Inc. 2007-08-02 [2017-06-10]. (原始内容存档于2012-04-09). 
  2. ^ See http://www.ibm.com/developerworks/java/library/j-genericdao/index.html页面存档备份,存于互联网档案馆) for workarounds
  3. ^ Hodgson, Kyle; Reid, Darren. ServiceStack 4 Cookbook. Packt Publishing Ltd. : Chapter 4 [22 June 2016]. ISBN 9781783986576 (英语). 

外部链接