数据访问对象

软件设计模式

电脑软件中,数据访问对象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 (英语). 

外部链接