j2ee+DAO
c. 要点

  § 既然这种模式不涉及到数据访问,就应该用Session Bean来实现。

  § 对于用简单接口来实现复杂EJB的子系统来说,是一个理想的选择。

  § 这个模式不适用于无流程处理的应用。

  § 这个模式可以减少客户端于EJB之间的通信和依赖。

  § 所有和EJB有关的交互,都有同一个Session Bean来控制,可以减少客户端对EJB的误用。

  § 这个模式可以使支持多类型客户端变得更容易。

  § 可以减少网络数据传递。

  § 所有的服务器端的实现细节都对客户端隐藏,在改变发生后,客户端不用重新发布。

  § 这个模式可以同样看成一个集中处理器来处理所有的安全或日志纪录。

  4. Data Access Object

  a. 问题

  目前为止,你看到的模型都是用来构建可伸缩的,易于维护的J2EE应用。这些模式尽可能的把应用在多个层上来实现。但是,还有一点必须强调:EJB的数据表现。它们包括象EJB这样的数据库语言。如果数据库有改变的话,相应的SQL也必须改变,而EJB也必须随之更新。

  这些常见问题就是:访问数据源的代码与EJB结合在一起,这样致使代码很难维护。看以下的代码。

  An EJB that has SQL code embedded in it

// all imports required
// exceptions not handled in the sample code

public class UserAccountEJB implements EntityBean {

// All EJB methods like ejbCreate, ejbRemove go here
// Business methods start here

public UserDetails getUserDetails(String userId) {

// A simple query for this example
String query = "SELECT id, name, phone FROM userdetails WHERE name = " + userId;

InitialContext ic = new InitialContext();
datasource = (DataSource)ic.lookup("java:comp/env/jdbc/DataSource");
Connection dbConnection = datasource.getConnection();
Statement stmt = dbConnection.createStatement();
ResultSet result = stmt.executeQuery(queryStr);

// other processing like creation of UserDetails object

result.close();
stmt.close();
dbConnection.close();
return(details);
}
}


  b. 建议的解决方法

  为了解决这个问题,从而让你能很方便的修改你的数据访问。建议使用DAO模式。这个模式把数据访问逻辑从EJB中拿出来放入独立的接口中。结果是EJB保留自己的业务逻辑方法,在需要数据的时候,通过DAO来访问数据库。这样的模式,在要求修改数据访问的时候,只要更新DAO的对象就可以了。看以下的代码。

  A Data Access Object that encapsulates all data resource access code

// All required imports
// Exception handling code not listed below for simplicity

public class UserAccountDAO {

private transient Connection dbConnection = null;

public UserAccountDAO() {}

public UserDetails getUserDetails(String userId) {

// A simple query for this example
String query = "SELECT id, name, phone FROM userdetails WHERE name = " + userId;

InitialContext ic = new InitialContext();
datasource = (DataSource)ic.lookup("java:comp/env/jdbc/DataSource");
Connection dbConnection = datasource.getConnection();
Statement stmt = dbConnection.createStatement();
ResultSet result = stmt.executeQuery(queryStr);

// other processing like creation of UserDetails object

result.close();
stmt.close();
dbConnection.close();
return(details);
}

// Other data access / modification methods pertaining to the UserAccountEJB
}


  现在你有了一个DAO对象,利用这个对象你可以访问数据。再看以下的代码。

  An EJB that uses a DAO

// all imports required
// exceptions not handled in the sample code

public class UserAccountEJB implements EntityBean {

// All EJB methods like ejbCreate, ejbRemove go here

// Business methods start here

public UserDetails getUserDetails(String userId) {

// other processing as required
UserAccountDAO dao = new UserAccountDAO();
UserDetails details = dao.getUserDetails(userId);
// other processing as required
return(details);
}
}


  任何数据源的修改只要更新DAO就可以解决了。另外,为了支持应用能够支持多个不同的数据源类型,你可以开发多个DAO来实现,并在EJB的发布环境中指定这些数据源类型。在一般情况下,EJB可以通过一个Factory对象来得到DAO。用这种方法实现的应用,可以很容易的改变它的数据源类型。

  c. 要点

  § 这个模式分离了业务逻辑和数据访问逻辑。

  § 这种模式特别适用于BMP。过一段时间,这种方式同样可以移植到CMP中。

  § DAOs可以在发布的时候选择数据源类型。

  § DAOs增强了应用的可伸缩性,因为数据源改变变得很容易。

  § DAOs对数据访问没有任何限制,甚至可以访问XML数据。

  § 使用这个模式将导致增加一些额外的对象,并在一定程度上增加应用的复
------

回复此文章 |

http://www.donews.net/lqb/archive/2004/06/13/27997.aspx
学习编译更好的 DAO 的技巧
级别:高级
Sean C. Sullivan (dao-article@seansullivan.com)
软件工程师
2003年10月

J2EE 开发人员使用数据访问对象(Data Access Object DAO)设计模式,以便将低级别的数据访问逻辑与高级别的业务逻辑分离。实现 DAO 模式涉及比编写数据访问代码更?,我参加了一个由有才华的软件工程师组成的小组,构建定制的、基于 Web 的供应链管理应用程序。我们的应用程序访问范围广泛的持久性数据,包括配送状态、供应链衡量(metrics)、库存、货运发票、项目管理数据和用户信息。我们用 JDBC API 连接到我们公司的不同数据库平台上,并在整个应用程序中使用 DAO 设计模式。

图 1 显示了应用程序和数据源之间的关系:

图 1. 应用程序和数据源


在整个应用程序中使用数据访问对象(DAO)使我们可以将底层数据访问逻辑与业务逻辑分离开来。我们构建了为每一个数据源提供 GRUD (创建、读取、更新、删除)操作的 DAO 类。

在本文中,我将为您介绍构建更好的 DAO 类的 DAO 实现策略和技术。更确切地说,我将讨论日志、异常处理和事务界定。您将学到如何将这三者结合到自己的 DAO 类中。本文假定您熟悉 JDBC API、SQL 和关系数据库编程。

我们将以对 DAO 设计模式和数据访问对象的概述开始。

DAO 基础
DAO 模式是标准 J2EE 设计模式之一。开发人员用这种模式将底层数据访问操作与高层业务逻辑分离开。一个典型的 DAO 实现有以下组件:

一个 DAO 工厂类
一个 DAO 接口
一个实现了 DAO 接口的具体类
数据传输对象(有时称为值对象)
具体的 DAO 类包含访问特定数据源的数据的逻辑。在下面一节中您将学习设计和实现数据访问对象的技术。有关 DAO 设计模式的更多内容请参阅 参考资料。

事务界定
关于 DAO 要记住的重要一点是它们是事务性对象。由 DAO 所执行的每一个操作 -- 如创建、更新或者删除数据 -- 都与一个事务相关联。因此,事务界定的概念就变得特别重要了。

事务界定是定义事务边界的方式。J2EE 规范描述了两种事务界定的模型:编程式(programmatic)和声明式(declarative)。表 1 分析了这两种模型:

表 1. 两种事务界定的模型 声明式事务界定 编程式事务界定
程序员用 EJB 部署描述符声明事务属性。 程序员负责编写事务逻辑。
运行时环境(EJB 容器)用这些属性自动管理事务。 应用程序通过一个 API 控制事务。


我们将侧重于编程式事务界定。

设计考虑
如前所述,DAO 是事务性对象。一个典型的 DAO 执行像创建、更新和删除这样的事务性操作。在设计 DAO 时,首先要问自己以下问题:


hofman   2005-11-19 22:36:48 评论:2   阅读:2476   引用:0
无题 @2008-09-24 13:22:46  
写得不错,转用了,谢谢!!~
评论 @2005-12-06 20:40:08  feng
写的很好!!我很喜欢这篇文章!!

发表评论>>

署名发表(评论可管理,不必输入下面的姓名)

姓名:

主题:

内容: 最少15个,最长1000个字符

验证码: (如不清楚,请刷新)

Copyright@2004-2010 powered by YuLog