将DBMS存储过程封装为会话EJB组件中的方法(2)

1/5/2008来源:Java教程人气:5160


  将DBMS存储过程封装为会话EJB组件中的方法(2)

· EJB 组件远程接口

// EnterPRise javaBean Remote Interface for Analysis session bean
public interface Analysis extends javax.ejb.EJBObject {
// remote interface for our lookupClient method
com.ibm.db.CallableStatement lookupClient(java.lang.Integer clientId)
throws java.rmi.RemoteException;
. . .
}

请注重,假如使用 VisualAge EJB 组件向导,则无需对此进行手工编码。替代方法是,在 bean 的实现类中对此方法编码之后,通过菜单项来将该方法提升(promote)到 bean 的远程接口,然后,将自动添加必需的代码。

编码存储过程封装器方法
现在可以集中讲述 bean 实现类本身,将在该实现类中包括调用存储过程的代码,并将其所有输出作为 com.ibm.db.CallableStatement 对象返回。此代码样本包含调用 CLIENTREPORT 存储过程的 lookupClient(...) 方法的完整实现。将在后续章节中具体讲解每个代码块(参考代码中的注释)的逻辑,以便您更好地理解如何为自己的存储过程实现类似的方法。

· 连接到数据库

让我们更具体地查看此代码的各部分。

在调用存储过程之前,需要建立一个到 DBMS 的连接。有两种方法做得到:使用 1.0 样式的连接,或者使用 JDBC 2.0 样式的 DataSource。在 WebSphere 环境中,通常选用后者,因为它提供连接池(connection pooling),这可以更有效地使用系统资源。出于这种原因,我们的编码模式使用 DataSource。

除了确定要建立的连接类型之外,还应该考虑要将连接逻辑放在 bean 中的什么地方。有多个选择:

直接放在封装器方法(wrapper method)中
放在私有辅助方法(helper method)中
放在 ejbCreate() 方法中(并将相应的断开逻辑放在 ejbRemove() 方法中)
这些方法的利弊超出了本文的范围。为简单起见,样本代码将所有连接/断开逻辑直接放在方法中。

代码块 1 显示了在使用 VisualAge for Java 3.0.2 和 WebSphere 3.0.2.1 时,如何使用 DataSource 进行连接。我们创建了一个散列表,在其中填充适合于 WebSphere 环境的值,然后建立一个 InitialContext。代码的以下几行利用该初始上下文和 Java 命名和目录接口 (JNDI) 服务,来获得期望的 DataSource 的索引,我们以前在 WebSphere 中用“治理控制台”创建了该 DataSource。本例中的 DataSource 名为 LocalDB2Sample。下一步,使用该 DataSource 来获得一个连接,并向其传递合适的数据库用户标识和口令。从连接池获得连接之后,可以将该信息提供给 DAB DatabaseConnection 对象,来设置它所需的连接规范。最后,将 autoCommitMode 设置成 false,因为 EJB 组件负责处理事务治理服务。

测试时,在 VisualAge for Java WebSphere 测试环境中运行使用 DataSource 的 EJB 组件会很方便。有关如何在产品发行版 3.0.2 中这样做的指示,请参阅 David Zimmerman 所著的 "Creating DataSources in the VisualAge for Java WebSphere Test Environment"(在参考资料中)。

· 调用存储过程

建立了连接之后,可以集中讲述如何调用存储过程了。如封装器方法编码示例中的代码块 2 所示,首先创建一个 DAB StatementMetaData 对象,该对象中有存储过程的规范。下一步,定义要执行的 SQL 语句。在这里将要调用 CLIENTREPORT 过程,该过程需要一个输入参数(用于客户标识)和两个输出参数(用于客户名称和电子邮件地址)。下一步,将参数添加到规范中。对于每个过程参数,都指定了参数名,其数据类型及其参数模式。

代码块 3 创建即将执行的 DAB CallableStatement 对象。CallableStatement 代表可用来执行存储过程的 SQL。创建完对象之后,将其元数据设置成在代码块 2 中指定的形式。然后将 DatabaseConnection(在代码块 1 中创建)与该 CallableStatement 关联。

下一个任务很简单:需要执行 CallableStatement 对象,这将使 DBMS 运行存储过程。但是,在这样做之前,必须通过 EJB 客户机应用程序,将过程的输入参数设置成传入方法的值。代码块 4 中显示了这种逻辑。

检索存储过程的输出并返回到调用程序
在封装器方法编码示例的代码块 5 中,将检索存储过程返回的输出参数。想起来了吗?这些参数代表 Web 站点客户的名称和电子邮件地址。但是,不需要显式地检索存储过程返回的结果集。(这些结果集包含有关客户投资总额和公告板发表信息的数据)。您可能要问:为什么会这样呢?