无标题文档 用 WSAD5.0和SQLServer2K采用Meet-in-Middle模式 开发CMP实体Bean及其完整客户端
(上篇:CMP的开发) abnerchai( 柴政 ) 2004 年 6 月
说明: 在许多情况下,我们现在还常常使用 CMP 实体 Bean ,而 IBM 的 WebSphere Studio Application Developer5.0 (中文版)简称 wsad5 是我们常用的开发工具,同时,我们也常使用 MS SQL Server2k 作为我们的数据库服务器,由于 WSAD5.0 在默认情况下对 DB2 和 Oracle 的 JDBC 支持的较好,但对 SQL Server 支持的不是那么的完美。在这篇文章中,我用详细的文字和清晰的图片给大家演示了如何用 WSAD5 和 SQL Server2k ,采用 Meet-in-Middle 模式来开发一个完整的 CMP 实体 Bean 及其客户端测试程序。本文档由 abnerchai( 柴政 ) 编写,任何人可以发布传播做学习之用,不得用作商业用途。
一、内容介绍 WSAD 中 CMP 的开发方法
WSAD 中的 SessionBean 的开发方法
WSAD 中 JavaBean 和 JSP 页面的开发方法
配置简易的 JDBC 开发环境
优化 EJB 的调用。
二、 WSAD5中CMP开发方法简述: 在 WSAD5 中,有三种方法开发 CMP 实体 Bean ,一种是采用 Bottom-up 方式:即和实体 Bean 对应的数据库表巳经设计好了,并存在于数据库中,根据数据库表结构来自动生成我们的我 CMP 实体 Bean 。二是采用 Top-Down 模式,即我们在 WSAD 中设计好我们的实体 Bean ,然后让 WSAD 自动根据实体 Bean 中的设置来生成数据库表。三是采用 Meet-in-Middle 方式,就是数据库表己经设计好了,我们先把需要的实体 Bean 设计好,然后连接数据库,把实体 Bean 和数据库表人工映射起来。在本文中我们就采用这种方式,这也是一种常用的开发 CMP 实体 Bean 的方式。
三、开发 CMP实体Bean的详细过程 先创建数据库,在 SQLServer 中创建一个名为 HelloWorld 的库,并创建一个用户 abner ,密码为 abner ,并为其指定默认数据库 Helloworld ,然后用以下脚本创建一个表:
create table abner.employee
(
id int primary key,
name varchar(30),
email varchar(50)
)
注意:这个 SQL 语句指定了 employee 表属于 abner ,而不是 dbo 所有。
新建一个空目录,用作工作区,如:
D:\chai\myworkspace\wsad5_HelloWorld_all_j2ee_module
启动 WSAD5 ,选择上面的目录进入工作区
新建一个 EJB 项目,选择文件 -> 新建 EJB 项目,如下图:
选择创建 2.0EJB 项目。点下一步。
按图中所示填写,一个 EJB 项目对应于一个 EAR 项目。点完成。
在 J2ee 视图中的 j2ee 层次结构中,选择 HelloWorldEJBProject ,点右键,新建企业 Bean ,如下图所示:
然后在弹出的对话框中, EJB 项目一栏选择 HelloWorldEJBProject ,并点下一步:如下图所示:
然后,在出现的框中填入如下图所示的:
然后点下一步。按如下图所示的选择只创建远程视图
接着在上图中的 CMP 属性框右边点 ” 添加 ” ,如下图所示:
增加以下三个属性:其中把 id 字段选择为 ” 键字段 ” ,以做为主键。
id
int
name
java.lang.String
java.lang.String
然后回到上一个图示中,点下一步:在出现的框中,什么也不做,点“完成”。
过一会儿, WSAD 为我们创建了一个实体 Bean.
6 、下面我们来创建数据库表和实体 Bean 之间的映射。
在 J2ee 视图的层次结构中,点中 HelloWorldEJBProject ,点右键,选择生成 EJB 到 RDB 的映射。如下图所示:
在出现的对话框中,选择“创建新的后端文件夹“,点下一步,如下图:
然后,再在出现的对话框中,选择中间相遇:如下图所示:
然后点下一步,如下图所示:
在上图中,我们创建一个 JDBC 连接,这个 JDBC 连接用于 WSAD5 的实体 Bean 创建器和数据库表之间的映射连接。这个连接不提供以后由容器负责的实体 Bean 和数据库之间的同步使用的数据库连接,那个连接需要在测试服务器中去配置一个连接池。
上图中的配置说明如下:
连接名:这是这个临时 JDBC 连接的名字。
数据库:这个实体 Bean 要映射到哪一个数据库中
用户标识及密码:连接数据库用到的用户名及密码
数据库供应商:选择 MS SQL Server 2000
JDBC 驱动请选择: WebSphere Connect JDBC Driver
主机请选择:你的 SQL Server 装在哪个主机上的 IP 地址或主机名。
端口号: SQL Server 默认的 1433
类位置:这是选择 SQL Server2k 的 JDBC 驱动程序的位置, WSAD5.0 自己带的有 SQL SERVER 2k 的 JDBC 驱动,它于:
D:\Program Files\IBM\WebSphere Studio\runtimes\base_v5\lib\spy.jar;
D:\Program Files\IBM\WebSphere Studio\runtimes\base_v5\lib\base.jar;
D:\Program Files\IBM\WebSphere Studio\runtimes\base_v5\lib\sqlserver.jar;
D:\Program Files\IBM\WebSphere Studio\runtimes\base_v5\lib\util.jar
以上 D:\Program Files\IBM\ 是 WSAD5 安装的位置 .
点击浏览,把在以上文件夹中的四个驱动 jar 文件全部选择中。
然后点击下一步。 WSAD 会读出你的 SQLServer 中 Helloworld 数据库下非 dbo. 的数据表,在这里,就是我们开头创建的一个表 employee 。选中它,点下一步,如下图所示:
然后,点下一步,进入如下图所示部分:
在上图中, WSAD 让我们选择如何将实体 Bean 中的域和数据表字段之间映射,我们自己来映射它们之间的关系,我们选择“无”后,点完成,即可。过一会,我们的 WSAd 工作区即出现如下图所示的情况:
接着,我们在上图中设置 CMP 实体 Bean 和 employee 之间的对应关系,我们看到在 HelloWorldEJBProject 和 HelloWorld 数据库之间是对应的,因为它们的头上都有一个小的箭头,一个向左,一个向右。接着,我们让 Employee 实体 Bean 和 employee 表映射起来,先选中右的 employee 表,拖动它到左边 Employeep 实体 Bean 上,可以看到鼠标上出现一个小的圆,此时松开鼠标,可以看到 Employee 和 employee 上都出现了两个小三角箭头,表时己经映射了。用同样的方法,将 employee 表的 id,name,email 映射到实体 BeanEmployee 的对应的字段上。此时,我们的工作区将是如下所示:
此时,我们需要设置我们的实体 Bean 的一些部署属性,在上图中,双击 ejb 模块下的 Employee 实体 Bean ,将在右边工作区中出现“ EJB 部署描述符”,在下面选中“概述”页面,将拉到最下方,按下图所示选择:
将:后端标识,选择 MSSQLSERVER_V7_1
将 JNDI-CMP 生成器连接绑定下的 jndi 名输入为: jdbc/SQLSERVER2KJDBC ,表示我们我们的所有的 CMP 实体 Bean 在受容器管理时采用 jdbc/SQLSERVER2KJDBC 这个 jndi 数据库连接池中的数据库连接与数据库保持同步。这个数据库连接池我们呆会在创建测试服务器时创建,在这里设置好以后,我们的所有的实体 Bean 在受容器管理时,容器均会采用这里设置的 jndi 从数据库连接池中获取数据库连接。如果我们的每个 CMP 实体 Bean 需要采用单独的对应于不同的数据库连接池的连接,我们需要为每个实体 Bean 单独设置数据库连接池的 jndi 名字。设置方法如下:打开一个实体 Bean 的部署描述符编写器,并选中下面的 Bean 页面,滚动页面到 ”WebSphere 绑定 ” 处,如下图所示:
我们可以在上面的 CMP 容器生成器 JNDI 名称处填写你想用的单独的数据库连接池的 jndi 名字,并选择容器授权类型。
同时,将 JNDI-CMP 生成器连接绑定下的容器授权类型选择为: Container ,表示由容器来管理我们的数据库连接的一些属性。
选择好后,点保存。
下面我们就来创建一个测试服务器,用来测试我们的 EJB 。方法如下:
在 J2ee 视图的 j2ee 层次结构视图中,选择服务器,然后点右键,在弹出的菜单中选择“新建” -> “服务器和服务器配置”如下图所示:
将弹出如下图所示的页面:
按上图所示填写,然后点击“下一步”并在弹出的对话框中选择“是”,进入如下图所示页面:
不更改端口,直接点“完成”即可。然后左边 j2ee 视图中出现如下图所示情况:
在上图双击服务器下的第一个 myWebsphereServer 项,在右边工作区中出现服务器配置页面。选择“安全性页面”,并在 JAAS 条目下面选择“添加”,弹出如下图所示的对话框:
在弹出的对话框中填写连接数据库用户的信息,如上图所示。
然后保存,并点击“数据源页面”,出现如下图所示页面:
在上图中,我们针对“服务器设置”设置我们的数据库连接池。首先在“ JDBC 提供程序列表”框右边点“添加”进入如下图所示对话框:
在上图中,选择数据库类型为 MS SQL Server ,并请将 JDBC 提供程序类型选择为:
WebSphere embedded ConnectJDBC driver for MS SQL Server ,一项,
选择其它的 SQL Server 驱动在 WSAD5.0 中将会出错!
然后点击下一步,出现如下图所示画面:
在名称一栏中输入一个名字如 SQLJDBC1 ,为这个 JDBC 驱动起个名字。其它的不变。点“完成”回到主页面。然后,选中我们上面定义的 SQLJDBC1 ,在定义数据源栏中选择“添加”出现如下图所示画面:
选择第一个驱动,并选择 V5.0 数据源,点击下一步,进入如下图所示:
在上图中,填入我们的 JDBC 数据源信息,按如下填写:
名称: SQLJDBCDATASOURCE 为给这个数据源起的名字
JNDI 名称: jdbc/SQLSERVER2KJDBC ,这是我们 EJB 容器使用的数据库连接池的 jndi 名字
在“组件管理的认证别名”和“容器管理的认证别名”均选择我们在安全属性中创建的别名,用它来指定连接数据库的用户和密码。
并将“在容器管理的持久性( CMP )中使用此数据源”选中,使我们的 CMP 实体 Bean 使用此 JDBC 和数据库保持同步。
其它的不用更改,点击下一步,进入下一步,进入如下图所示画面:
在上图中,选择上面的一些属性,在下面填写属性的值:需要填写以下几个:
databaseName : helloworld 数据库名
serverName : 10.0.0.18 SQL Server 所在的服务器 IP 或名字
portNumber : 1433 默认的 SQL Server 的端口号
其它的不用更改,点“完成”回到服务器配置页面。并保存配置。同时关闭服务器配置页面。
将我们的 HelloWorldEARPorjcet 添加到服务器中,方法如下:
在 J2ee 视图中左边的 j2ee 层次结构处选择“服务器配置”下的“ MyWebsphereServer ”,用右键点开,在弹出的菜单中,选择“添加”- > 将我们的项目加入到测试服务器中。如下图所示:
生成实体 Bean 的部署代码,在 J2ee 视图中选中我们的 Employee 实体 Bean ,然后点击右键中的生成部署代码,如下图所示:
等一会即可。
初步测试我们的实体 Bean ,在 J2ee 视图中,点击“ Employee 实体 Bean ”,右键“在服务器上运行”,系统会自动启动我们的服务器,然后,我们即可在通用测试客户机上测试我们的实体 Bean 。如下图所示:
下面我们来修改我们的 CMP 实体 Bean ,增加一些方法:
首先,修改我们的 Create 方法,使其支持多个参数创建对象,打开 EmployeeHome.java 文件,把其中的 Create 方法改为以下所示的情况:
public com.employee.com.Employee create( int id,String name,String email)
throws javax.ejb.CreateException, java.rmi.RemoteException;
同时,将 EmployeeBean.java文件中的ejbcreate和 ejbPostCreate 也修改为如下所示:
public com.employee.com.EmployeeKey ejbCreate( int id,String name,String email)
throws javax.ejb.CreateException {
setId(id);
setName(name);
setEmail(email);
return null ;
}
public void ejbPostCreate( int id,String name,String email) throws javax.ejb.CreateException {
}
保存。
下面新增加两个查找方法。在 J2ee视图中打开Employee部署描述符文件编辑器,打开 ” Bean页面 ” ,找到“查询”处,如下图所示:
点击“添加”如下图所示:
新增一个 findByName 的方法。然后点击下一步,进入如下图所示:
在图中 query 语句中输入:
select object(o) from Employee o where o.name = ?1
然后点完成。
用同样的方法创建一个 findByEmail 的查找方法如下:
接着,用同样的方法再一个 findAllEmployees 的方法:
select object(o) from Employee o where o.id is not null
完成后的如下图所示:
同时,我们需要将我们的实体 Bean 中的 getId () 方法提供给远程接口 , 使用远程方法可以引用 。 方法是 : 打开 EmployeeBean, 然后在屏幕左下角 “轮廓”窗口中,选中getId()方法,点右键->“企业BEAN”->提升至远程接口,如下图(36b)所示:
保存我我们设置。对 Employee 实体 Bean 重新生成部署代码。启动通用客户测试机即可测试我们的这个 CMP 实体 Bean 。
由于文章太长,我分成了上、下篇。在下篇中我们将编写CMP的客户端,并提供一种EJB调用的优化策略.