数据访问对象(DAO)设计模式 in Java

我的网站

数据访问对象(DAO) 设计模式是一个非常受欢迎的实现 Java 应用中持久层的设计模式,它是基于抽象封装设计原则并且避免应用受到来自持久层的改变所带来的影响。比如说,将数据从 Oracle 换到 MySQL,或者将持久化从文件系统换到数据库。这里有这样的具体例子,当我们将依赖关系型数据库来做用户认证的方案调整为 LDAP 执行认证。如果我们使用了 DAO 设计模式来访问数据库,那些只需要在数据访问层作出改变的操作会相对来说是安全的。DAO 设计模式同样还能保证应用各部分之间的低耦合度,比如说视图层是完全独立于 DAO 层并且只有同样是实现 DAO 接口的服务层才依赖于 DAO 层。

顺便说下,DAO 或者 数据访问对象模式不是 Gang of Four 中所说的 GOF 设计模式,Design Patterns: Elements of Reusable Object-Oriented Software。它不是任何一种面向对象的设计模式而是封装的衍生。而它的好处就是将数据访问层的代码集中到一起,远离业务逻辑代码,这样在不影响应用中其他层(模型、视图层)的前提下能够独立的开发、优化。

此外我们还能通过 Generics 来模版化我们的 DAO 层。在使用 Spring 的时候我们可以利用 JdbcTemplate 来执行 JDBC 的调用,它能帮我们省掉不少公式化的重复的代码。使用 DAO 设计模式来访问数据是应遵循的 JDBC 最佳实践中之一 。

在 Java 中什么是 DAO 设计模式呢 ?

简单说来 DAO 设计模式是一种用于减少业务逻辑和持久逻辑之间耦合度的方式。应用的业务逻辑通常需要用到域对象而它们一般是持久到数据库、文件系统或者其它的持久存储设备里边。 DAO 设计模式允许你将执行 CRUD 的操作代码封装起来而避免应用的其他部分执行这些操作,这就意味着那些应用中其他层已经被测试好的逻辑不会应为持久层逻辑的更改受到影响。 DAO 设计模式也就让应用能够应付数据库提供者或者持久技术的变动。

DAO 设计模式的好处

DAO 或者 数据访问对象设计模式是一个抽象和封装面向对象原则的不错例子,它划分出来的一个层叫做数据访问层,应用在持久机制中有改变的情况下能够做到安全的反馈。比如说,当我们从基于文件的持久机制切换到数据库时,相应的改变会被限制到数据访问层而不会影响到服务层或者与对象。数据访问对象或者 DAO 设计模式在 Java 应用中是一个标准,已经应用到它的核心、web 应用和企业级应用中。下面是一些应用了 DAO 模式的 Java 应用:

1)  DAO 设计模式能够使 JUnit test 运行的更快,通过创建 Mock 而不需要创建指向数据库的链接来跑测试用例,通常创建 Mock 对象来做测试要比整合数据库腰来的更容易。而且测试过程中如果碰到任何的问题都只需要检查业务逻辑代码而不用去关心数据库。同时还避免了数据库连接和环境问题

2) 因为 DAO 设计模式是基于接口设计的,也就是说它拥有了面向对象设计原则“面向接口编程而非实现编程”所具有的灵活性和可维护性代码的优势。

如何在 Java J2EE 应用中应用 DAO 设计模式

下图展示了在 Java 和 J2EE 应用中数据访问模式是如何实现的。我们可以看到 DAO 的类,比如, AdressDAO, PersonDAO and CompanyDAO 是用来访问数据库然后将值填充到一个 Contact 对象中。

客户端服务程序不是直接访问上述的类取而代之的是通过 ContactDAO 接口来访问它们,而此接口的对象是由 ContactDAOFactory 根据数据库厂商所实现的 DAO 类创建出来的。比如,我们现在获得的是可以访问 HSQL DB 的类。相应的我们也可以返回能够访问 Oracle、SQL Server or MySQL 等的数据库访问类。

Screen Shot 2016-02-29 at 22.41.01

DAO 设计模式例子

数据访问对象或 DAO 设计模式的核心是 Java 接口,在里边可以定义各种有关 CRUD 的操作,比如 Create, Read, Update and Delete。根据我们应用的后端技术的区别我们可以创建这个接口的不同实现方案,比如,JdbcDAOImpl 用 JDBC 来连接数据库, HibernateDAOImpl 来访问 Hibernate, FileDAOImpl,但我们使用的是文件系统来持久化数据。服务层使用了这个数据访问对象那么就可以通过接口与数据访问层做交互。这里是一个典型的 DAO 接口的例子:

public interface AccountDAO{
public boolean save(Account account);
public boolean update(Account account);
public boolean findByAccountNumber(int accountNumber);
public boolean delete(Account account);
}

上边的代码定义了几个关于 CRUD 操作的方法。现在我们可以创建基于这个接口的不同实现。比如,JdbcAccountDAOImpl or HibernateAccountDAOImpl。我们的 JdbcAccountDAOImpl 将会把 SQL 查询语句通过 JDBC API 或者 Spring JdbcTemplate 执行 CRUD 查询。

这就是所有关于 Java 里边 数据访问对象 or DAO 设计模式是什么以及在 Java 应用中使用 DAO 设计模式的优势有哪些。我们也看了一个如何用 AccountDAO 接口来实现数据访问对象 设计模式的例子。在 Java 应用中通过 DAO 设计模式来创建持久层是 JDBC 实践中的一种。


翻译原文

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章