DAO 学习笔记

         最近正在开发的一个项目是autotest 的web app应用。我负责开发的模块是DAO.现在工作已经基本完成,但今天一时兴起,google了一下,才发现它是一个经常使用的设计模式。在查阅了网上很多资料之后,我结合自己的开发经验,写了这篇学习笔记,希望能够对大家有所帮助。

一  有关DAO模式的介绍
        DAO(Data Access Object)模式实际上是两个模式的组合,即Data Accessor 模式和 Active Domain Object 模式,其中 Data Accessor 模式实现了数据访问和业务逻辑的分离,而Active Domain Object 模式,其中Data Accessor模式实现了数据访问和业务逻辑的分离,而Active Domain Object 模式实现了业务数据的对象化封装,一般我们将这两个模式组合使用。

        业务对象只应该关注业务逻辑,不应该关心数据存取的细节。数据访问对象必须实现特定的持久化策略(如,基于JDBC或Hibernate的持久化逻辑), 这样就抽出来了DAO层,作为数据源层,而之上的Domain Model层与之通讯而已,如果将那些实现了数据访问操作的所有细节都放入高层Domain model(领域模型)的话,系统的结构一定层次上来说就变得有些混乱。低级别的数据访问逻辑与高级别的业务逻辑分离,用一个DAO接口隐藏持久化操作的 细节,这样使用的最终目的就是让业务对象无需知道底层的持久化技术知识,这是标准 j2ee 设计模式之一。一个典型的的DAO组成:DAO工厂类,DAO接口,实现DAO接口的具体类(每个 DAO 实例负责一个主要域对象或实体),VO(Value Object)。如果一个DAO 工厂只为一个数据库的实现(现在只考虑这种情况)而创建很多的DAO的时候,实现该策略时,我们考虑采用工厂方法设计模 式.

二  DAO模式的目标

        DAO模式通过对业务层提供数据抽象层接口,实现了以下目标:

1. 数据存储逻辑的分离
        通过对数据访问逻辑进行抽象,为上层机构提供抽象化的数据访问接口。业务层无需关心具体的select,insert,update操作,这样, 一方面避免了业务代码中混杂JDBC调用语句,使得业务落实实现更加清晰,另一方面,由于数据访问几口语数据访问实现分离,也使得开发人员的专业划分成为 可能。某些精通数据库操作技术的开发人员可以根据接口提供数据库访问的最优化实现,而精通业务的开发人员则可以抛开数据曾德繁琐细节,专注于业务逻辑编 码。

2. 数据访问底层实现的分离
        DAO模式通过将数据访问计划分为抽象曾和实现曾,从而分离了数据使用和数据 访问的地称实现细节。这意味着业务层与数据访问的底层细节无关,也就是说,我们可以在保持上层机构不变得情况下,通过切换底层实现来修改数据访问的具体机 制,常见的一个例子就是,我们可以通过仅仅替换数据访问曾实现,将我们的系统部署在不同的数据库平台之上。

3. 资源管理和调度的分离
        在数据库操作中,资源的管理和调度是一个非常值得关注的主题。大多数系统的性能瓶颈往往并非集中于业务逻辑处理本身。在系统涉及的各种资源调度过程中,往往存在着最大的性能黑洞,而数据库作为业务系统中最重要的系统资源,自然也成为关注的焦点。DAO模 式将数据访问逻辑从业务逻辑中脱离开来,使得在数据访问层实现统一的资源调度成为可能,通过数据库连接池以及各种缓存机制(Statement Cache,Data Cache等,缓存的使用是高性能系统实现的一个关键所在)的配合使用,往往可以保持上层系统不变的情况下,大幅度提升系统性能。

4.数据抽象
        在直接基于JDBC调用的代码中,程序员面对的数据往往是原始的RecordSet数据集,诚然这样的数据集可以提供足够的信息,但对于业务逻辑开发过程而言,如此琐碎和缺乏寓意的字段型数据实在令人厌倦。
        DAO 模式通过对底层数据的封装,为业务曾提供一个面向对象的接口,使得业务逻辑开发员可以面向业务中的实体进行编码。通过引入DAO模 式,业务逻辑更加清晰,且富于形象性和描述性,这将为日后的维护带来极大的便利。试想,在业务曾通过Customer.getName方法获得客户姓名, 相对于直接通过SQL语句访问数据库表并从ResultSet中获得某个字符型字段而言,哪种方式更加易于业务逻辑的形象化和简洁化?

三 DAO设计要注意的问题
        在采用这种工厂方法设计模式来实现时我们其实要注意很多问题,哪个对象负责开始事务,哪个负责事务结束?DAO 是否要负责事务的开始和结束? 应用程序是否需要通过多少个DAO访问数据?事务涉及一个DAO还是多个DAO?一个DAO是否调用另一个DAO的方法?了解上述问题的答案将有助于我们 选择最适合的 DAO 的事务界定策略。在 DAO 中有两种主要的界定事务的策略。一种方式是让 DAO 负责界定事务,另一种将事务界定交给调用这个 DAO 方法的对象处理。如果选择了前一种方式,那么就将事务代码嵌入到 DAO 中。如果选择后一种方式,那么事务界定代码就是在 DAO 类外面


以上是概念上的介绍,在下一篇笔记里,我将用实例进行说明。


reference:
http://lincoln.javaeye.com/blog/33727
http://blog.csdn.net/lin_bei/archive/2006/08/10/1048051.aspx
http://www.phome.net/document/java/200504/java111245704413630.html
发布了16 篇原创文章 · 获赞 4 · 访问量 4万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章