dyerac  
dyerac In Java
公告

日历
<2024年5月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678
统计
  • 随笔 - 36
  • 文章 - 10
  • 评论 - 94
  • 引用 - 0

导航

常用链接

留言簿(5)

随笔分类(49)

随笔档案(36)

文章分类(11)

文章档案(10)

相册

dyerac

搜索

  •  

积分与排名

  • 积分 - 77992
  • 排名 - 707

最新随笔

最新评论

阅读排行榜

评论排行榜

 
 

使用 SQLJ 开发应用程序

用 DB2 UDB V8.1 和 Application Developer V5.1.2 创建使用 SQLJ 的 Java 和 J2EE 应用程序

文档选项

将此页作为电子邮件发送

未显示需要 JavaScript 的文档选项

样例代码

级别: 初级

Owen Cline (owenc@us.ibm.com), 认证的 IT 咨询专家 - WebSphere 软件服务, IBM

2005 年 2 月 01 日

这篇 "how-to" 文章将解释如何在 Java™ 应用程序和 J2EE™ 应用程序中使用 SQLJ。文中将介绍 SQLJ 语法,使用 SQLJ 访问数据源,建立 WebSphere® Application Developer 项目以支持 SQLJ,以及创建和调用 DB2® 存储过程。

SQLJ 概述

SQL 语句包括查询(SELECT)、插入(INSERT)、更改(UPDATE)、删除(DELETE)语句以及其他对存储在关系数据库表中的数据进行操作的语句。SQLJ 是在 Java 中嵌入这些 SQL 语句的一种约定,它是以某种允许编程工具对 Java 中 SQL 进行编译时分析的方式实现嵌入的,在编译时会对 SQL 语句进行语法检查以保证语法的正确性,进行类型检查以确定 Java 和 SQL 之间交换的数据具有兼容的类型和适当的类型转换,以及进行模式检查以确保 SQL 结构在它们执行时所在的数据库模式中是格式良好的、合法的。嵌入式 SQL 语句被称为是 "静态的(static)",因为这些语句在 Java 程序中一目了然,因而嵌入式 SQL 语句随着包含它们的 Java 程序的编译而编译(通常的术语是"预编译")。我们提议将 SQLJ 作为用于紧密集成 Java/SQL 程序的一种方便有效的标准。

SQLJ 简史

正如 Connie Tsui 在她的文章(后面有引用)中解释的那样,一个非正式的、开放的数据库供应商组织在 1997 年 4 月开始定期的会面,以便交换关于如何在 Java 编程语言中使用静态 SQL 语句和结构的思想。主要参与者包括 IBM®、Oracle、Compaq、Informix®、Sybase、Cloudscape™ 和 Sun Microsystems。该组织将他们为之努力的规范命名为 JSQL。在发现 JSQL 已经是商标术语后,JSQL 被更名为 SQLJ。在 1997 年 12 月,Oracle 向其他成员提供了 Java 中嵌入式 SQL 的一个参考实现。该参考实现可以在任何支持 JDK 1.1 的平台上运行,并且是与供应商无关的。在 1998 年 12 月,用于在 Java 中嵌入 SQL 的规范被完全开发出来,并且被接受为 ANSI 标准 Database Language —— SQL, Part 10 Object Language Bindings (SQL/OLB) ANSI x3.135.10-1998。该规范已经被当作 SQLJ 规范的 Part 0 供大家引用。如今它被称作 SQL/OLB (Object Language Bindings)。

SQLJ 与 JDBC 的比较

SQLJ —— Java 数据库应用程序的开门咒语

SQLJ 标准现在为 Java 应用程序提供了基于 SQL 的数据库访问。SQLJ —— Java 数据库应用程序的开门咒语

下面是 SQLJ 相对于直接在 JDBC 中编写代码的优势:

SQLJ 程序需要的代码行数比 JDBC 程序更少。SQL 程序更简短,因而更易于调试。SQLJ 可以通过在编译时使用数据库连接,对代码执行语法和语义上的检查。SQLJ 提供了对查询结果及其他返回参数的强类型检查,而 JDBC 值则是直接从 SQL 返回,在编译时未进行任何检查。

SQLJ 为处理 SQL 语句提供了一种简化的方式。现在无需编写不同的方法调用来绑定每个输入参数和获取每个选择列表项,而只需编写一条使用 Java 宿主变量的 SQL 语句。SQLJ 会替您完成绑定。

然而,JDBC 提供了对 SQL 语句的执行的细粒度控制,并提供了真正的动态 SQL 能力。如果应用程序需要动态能力(在运行时发现数据库或实例元数据),那么应该使用 JDBC。

回页首

为 SQLJ 建立 WebSphere Studio Application Developer 项目

如果您计划将 SQLJ 代码包括到所有 WebSphere Studio Application Developer (Application Developer) 项目中,那么需要使您的项目支持 SQLJ。为此,可以右击项目并选择 Add SQLJ Support。这将弹出 SQLJ 向导,如下所示。

图 1. 使 Application Developer 项目支持 SQLJ

回页首

SQLJ 和 Java 应用程序

从 Application Developer 主菜单中,选择 File -> New -> Other ,然后选择 Java Java Project。单击 Next

图 2. 创建 Java 项目

输入项目名,单击 Next

图 3. 输入 Java 项目名

选择 Finish 创建该项目。

图 4. 输入 Java 项目设置

为了让 Java 应用程序能够成功运行,还需添加 DB2 JDBC 驱动程序 db2java.zip。右击 Java 项目,选择 Properties

图 5. 编辑 Java 项目属性

接下来,选择 Java Build path,然后选择 Libraries 标签页。然后选择 Add External JARs

图 6. 添加外部 JAR —— db2java.zip

完成这些设置后,库路径应该如下所示:

图 7. 添加外部 JAR —— db2java.zip

接下来的步骤是创建有关 Java 类,用于容纳主方法。为此,需要右击 Java 项目,然后选择 New -> Class。填入包名和类名。另外,确保勾选了关于创建主方法的复选框。单击 Finish

图 8. 创建 Java 主类

最后,需要创建 SQLJ 文件。从 Application Developer 主菜单中,选择 File -> New -> Other,然后选择 Data -> SQLJSQLJ File。最后单击 Next。Application Developer 将保证 SQLJ 文件被转换成一个 Java 文件。

图 9. 选择 SQLJ 文件向导

填入包名和文件名。然后单击 Finish

图 10. 创建 SQLJ 文件

至此,还需要将代码添加到 Java 主方法中,另外必须创建一个 SQLJ 方法。首先让我们明确要完成什么。我们将创建一个 SQLJ 方法,该方法从 DB2 SAMPLE 数据库中根据给定的雇员号读取一个雇员记录。这个 SQLJ 方法以雇员号(一个 Java String)作为输入,并将其作为参数传递给一条 SQLJ Select 语句。Java 主方法将调用这个 SQLJ 方法。

清单 1. 包含主方法的 Java 类

<![CDATA[
/*
* Created on Nov 27, 2004
*
*/
package com.ibm.sqlj.main;
import com.ibm.sqlj.Select;
/**
* @author Owen Cline
*
*/
public class SQLJJave {
public static void main(String[] args) {
Select select = new Select();
select.selectEmployee("000110");
}
}
]]>

清单 2. 包含 SQLJ 方法的 SQLJ 类

<![CDATA[
/*
* Created on Nov 27, 2004
*
*/
package com.ibm.sqlj;
import java.sql.*;
import sqlj.runtime.ref.*;
/**
* @author Owen Cline
*
*/
public class Select {
// First, load the JDBC driver
static
{ try
{ Class.forName ("COM.ibm.db2.jdbc.app.DB2Driver").newInstance ();
} catch (Exception e)
{ System.out.println ("\n Error loading DB2 Driver...\n");
System.out.println (e);
System.exit(1);
}
}
public void selectEmployee(String empNo) {
Connection con = null; DefaultContext ctx = null; try {
String firstName = null;
String lastName = null;
// use the DB2 SAMPLE database
String url = "jdbc:db2:SAMPLE";
// Get the connection
con = DriverManager.getConnection(url); // Set the default context
ctx = new DefaultContext(con); DefaultContext.setDefaultContext(ctx);
// Lookup the employee given the employee number
#sql { SELECT FIRSTNME, LASTNAME INTO :firstName, :lastName
FROM EMPLOYEE
WHERE EMPNO = :empNo } ;
System.out.println ("Employee " + firstName + " " + lastName);
ctx.close();
con.close();
}
catch( Exception e )
{
System.out.println (e);
}
}
}
]]>

现在便可以运行这个 Java 应用程序了。选中您的 Java 项目,然后从 Application Developer 主菜单中选择 Run -> Run As -> Java Application。您应该可以看到在控制台 "Employee VINCENZO LUCCHESSI" 中打印出如下消息。

回页首

SQLJ 和 J2EE 应用程序

您可能想到,还可以在 J2EE 应用程序、servlet、会话 bean、BMP 实体 bean 和 MDB bean 中使用 SQLJ。现在我们要做的就是将我们创建的在 Java 应用程序中运行的上述代码移植,使之在一个会话 bean 中运行。

首先,需要创建一个 EJB 项目。从 Application Developer 主菜单中,选择 File- > New -> Project。 然后选择 EJB and EJB Project。单击 Next

图 11. 创建 EJB Project

确保选择了 Create 2.0 EJB Project ,然后单击 Next

图 12. 选择一个 EJB 版本

现在,输入 SQLJSession 作为 EJB 项目名。EAR 项目应该是 DefaultEAR。单击 Next

图 13. 输入 EJB 项目名

在 Module Dependencies 对话框中,选择 Finish 创建 EJB 项目和 EAR 项目。

图 14. 输入 EJB 模块依赖

在这里,我们还想创建一个会话 Bean。 选择 Application Developer 主菜单中的 File -> New -> Enterprise Bean。然后单击 Next

图 15. 创建一个会话 Bean —— 步骤 1

确保选择了 Session bean 单选按钮,并输入了一个 Bean 名称。然后单击 Next

图 16. 创建一个会话 Bean —— 步骤 2

确保选中 Local client view 复选框,以得到本地接口(如果 EJB 容器部署在本地,那么这样做会更快一些),然后单击 Finish 创建会话 Bean。

图 17. 创建一个会话 Bean - 步骤 3

现在我们来创建一个 SQLJ 文件,该文件将包含我们的业务逻辑。右击 EJB 项目 SQLJSession 并选择 New -> Other,然后选择 Data -> SQLJSQLJ File。最后单击 Next

图 18. 创建 SQLJ 文件 —— 步骤 1

输入包名和文件名,然后选择 Finish 创建 SQLJ 文件。还应注意的是,由于是在一个项目中创建这个 SQLJ 文件,而这个项目还没有添加 SQLJ 支持,因此这一次需添加该支持。

接着,使用上述步骤创建第二个 SQLJ 文件,文件名为 SessionBeanSelectUsingDefaultDatasource,以便以后演示如何使用 defaultDataSource。现在,我们可以在创建的 SQLJ 文件中添加自己的业务逻辑,如下所示:

图 19. 创建 SQLJ File —— 步骤 2

清单 3. SessionBeanSelect.sqlj

<![CDATA[
package com.ibm.sqlj;
import java.sql.*;
import sqlj.runtime.ref.*;
import javax.sql.DataSource;
/**
* @author Owen Cline
*
*/
public class SessionBeanSelect {
// Setup datasource to use. Notice that I am not using a global JNDI name // but instead using a Resource Reference which points to the global JNDI name. // This is a best practice.
#sql public static context Ctx with (dataSource="java:comp/env/sqljDS");
public void selectEmployee(String empNo) {
String firstName = null;
String lastName = null;
try {
// Create context
Ctx conCtx = new Ctx();
// Lookup the employee given the employee number
#sql [conCtx] { SELECT FIRSTNME, LASTNAME INTO :firstName, :lastName
FROM EMPLOYEE
WHERE EMPNO = :empNo } ;
System.out.println ("SessionBeanSelect-Employee " + firstName + " " + lastName);
conCtx.close();
} catch (Exception e) {
System.out.println(e);
}
}
}
]]>

清单 4. SessionBeanSelectUsingDefaultDatasource.sqlj

<![CDATA[
package com.ibm.sqlj;
import java.sql.*;
import sqlj.runtime.ref.*;
import javax.sql.DataSource;
/**
* @author Owen Cline
*
*/
public class SessionBeanSelectUsingDefaultDatasource {
public void selectEmployee(String empNo) {
String firstName = null;
String lastName = null;
try {
// Lookup the employee given the employee number
#sql { SELECT FIRSTNME, LASTNAME INTO :firstName, :lastName
FROM EMPLOYEE
WHERE EMPNO = :empNo } ;
System.out.println ("SessionBeanSelectUsingDefaultDatasource-Employee " + firstName + " " + lastName);
} catch (Exception e) {
System.out.println(e);
}
}
}
]]>

现在,我们要添加 bean 模块,以便调用 SQLJ 文件中的业务逻辑。编辑 SQLJSessionBeanBean.java 文件,添加两个方法:selectEmployee 和 selectEmployeeUsingDefaultDatasource,如以下清单所示。然后,别忘了使这两个方法成为本地接口。最后,在进入下一步之前,确保生成了部署和 RMIC 代码。

清单 4. SQLJSessionBeanBean.java

<![CDATA[
package com.ibm.sqlj.ejb.session;
import com.ibm.sqlj.SessionBeanSelect;
import com.ibm.sqlj.SessionBeanSelectUsingDefaultDatasource;
/**
* Bean implementation class for Enterprise Bean: SQLJSessionBean
*/
public class SQLJSessionBeanBean implements javax.ejb.SessionBean {
private javax.ejb.SessionContext mySessionCtx;
/**
* getSessionContext
*/
public javax.ejb.SessionContext getSessionContext() {
return mySessionCtx;
}
/**
* setSessionContext
*/
public void setSessionContext(javax.ejb.SessionContext ctx) {
mySessionCtx = ctx;
}
/**
* ejbCreate
*/
public void ejbCreate() throws javax.ejb.CreateException {
}
/**
* ejbActivate
*/
public void ejbActivate() {
}
/**
* ejbPassivate
*/
public void ejbPassivate() {
}
/**
* ejbRemove
*/
public void ejbRemove() {
}
/**
* selectEmployee
*/
public void selectEmployee(String empNo) {
SessionBeanSelect sbs = new SessionBeanSelect();
sbs.selectEmployee(empNo);
}
/**
* selectEmployee
*/
public void selectEmployeeUsingDefaultDatasource(String empNo) {
SessionBeanSelectUsingDefaultDatasource sbs = new SessionBeanSelectUsingDefaultDatasource();
sbs.selectEmployee(empNo);
}
}
]]>

为最终测试我们的会话 Bean,必须创建一个 Server Configuration。切换到 Server Perspective,并在 Server Configuration 视图中单击右键。选择 New -> Server and Server Configuration。输入服务器名 TestServer ,然后单击 Finish 创建该服务器。

图 20. 创建一个 Server Configuration

创建好服务器后,在服务器上单击右键(同样也是在 "Server Configuration" 视图中),然后选择 Add and Remove Projects。 在 "Add and Remove Projects" 对话框中(这里没有显示出来),添加 DefaultEAR 项目并单击 Finish

最后要做的是创建我们的会话 Bean 将要使用的 DB2 数据源。在 Server Configuration 视图中右击 Test Server,这将弹出服务器配置编辑器。选择 Security 标签页,然后选择下面显示的 JAAS Authentication Entries 对话框旁边的 Add 按钮。为该条目输入一个名称,然后输入一个用于访问数据库的合法用户名和密码。最后单击 OK

图 21. 添加 JAAS 认证条目

现在,选择 Data source 标签页。在 JDBC Provider 列表中选择 Default DB2 JDBC Provider 条目。单击在上面所选 JDBC 提供者中定义的数据源旁边的 Add 按钮。确保选中了 DB2 JDBC ProviderVersion 5.0 data source 单选按钮。然后单击 Next

图 22. 选择要创建的数据源的类型

输入 sqljDS 作为数据源名称,输入 jdbc/sqljDS 作为 JNDI 名称。对于 "Component-managed authentication alias" 和 "Container-managed authentication alias",都选择前面创建的 JAAS Authentication Entry。然后单击 Finish

图 23. 输入 sqljDS 的数据源参数

重复这些步骤,创建另一个名为 defaultDataSource 的数据源,数据源的 JNDI 名称为 jdbc/defaultDataSource。最后,保存该服务器配置。

图 24. 输入 defaultDataSource 的数据源参数

现在,我们需要创建一个 Resource Reference,以便会话 bean 可以查找 sqljDS 数据源。因此,切换到 Application Developer 中的 J2EE Perspective。在 J2EE Hierarchy 视图中,右击 SQLJSession EJB 项目,以调用 EJB Deployment Descriptor 编辑器。选择 References 标签页。选择 SQLJSessionBean 并选择 Add 按钮。选择 Resource Reference 单选按钮,然后单击 Next

图 25. 创建资源引用

输入 sqljDS 作为名称。选择 javax.sql.DataSource 作为类型。为 Authentication 选择 Container 。 保留 Sharing Scope 为 Shareable。然后单击 Finish

图 26. 输入资源引用参数

选中刚创建的资源引用,然后输入 jdbc/sqljDS 作为 JNDI 名。保存该 EJB 部署描述文件。

图 27. 输入资源引用的 JNDI 名

至此,您应该可以测试会话 Bean 模块了。首先,在 Server Perspective 中,通过在 Servers 视图中右键单击 TestServer 并选择 Start 来启动该服务器。接着,通过在 Servers 视图中单击右键并选择 Run universal test client 调用 Universal Test Client。从这个 universal test client 中,选择 JNDI Explorer 并展开 "jdbc" 菜单,以显示出两个数据源:sqljDS 和 defaultDataSource。接下来,完全展开 Local EJB beans 菜单,直到能够选择 SQLJSessionBeanLocalHome。在 EJB reference 菜单中完全展开菜单项,直到能够选择 SQLJSessionBeanLocal.create() 模块,然后选择 Invoke followed by the Work with Object 按钮。

图 28. 调用 SQLJSessionBeanLocal.create() 方法

现在,您将看到有两个方法可供调用:selectEmployee 和 selectEmployeeUsingDefaultDatasource。选择 selectEmployee 方法。输入 000110 作为 empNo 值,并选择 Invoke 按钮。检查控制台窗口,以确信显示了 "[11/28/04 16:56:05:176 PST] 6d2f338b SystemOut O SessionBeanSelect-Employee VINCENZO LUCCHESSI"。最后,您自己尝试一下 selectEmployeeUsingDefaultDatasource 方法。

图 29. 调用 selectEmployee() 方法

回页首

结束语

总之,对于不需要动态 SQL 的 Java 和 J2EE 应用程序,SQLJ 是提供持久性框架的一种非常有用的方式。虽然本文没有提到,但使用 SQLJ 开发存储过程也是可行的。

回页首

下载

描述 名字 大小 下载方法

code samples

SQLJArticle_sourcecode.zip

3443 KB

 

FTP

|

HTTP

关于下载方法的信息

Get Adobe® Reader®

参考资料

关于作者

Owen Cline 是位于加州圣地亚哥市的 IBM Software Services for Websphere 小组的一名成员。他有 20 多年软件开发领域的开发经验。他拥有 4 项软件专利,编写了大量 IBM 红皮书,并曾多次出席各种技术会议。在过去的 5 年当中,Owen 专门从事 J2EE 架构、应用开发和部署,重点研究了 WebSphere 平台。此外,这几年来,他还参与了许多高知名度的 Web 站点的开发。

 

源文档 <http://www.ibm.com/developerworks/cn/db2/library/techarticles/dm-0412cline/index.html>

 

posted on 2007-07-09 21:51 dyerac in java... 阅读(1031) 评论(0)  编辑  收藏 所属分类: 转载学习区

只有注册用户登录后才能发表评论。


网站导航:
 
 
Copyright © dyerac in java... Powered by: 博客园 模板提供:沪江博客