日期:2013-04-26 浏览次数:20570 次
SQLJ的概述
今天的企业级使用程序通常运转在多数据库平台上,例如Oracle、DB2、Sybase、SQL Server、Informix等等。在这个环境里,代码的可移殖性和可维护性正变得越来越重要。从一个数据库平台到另一个数据库平台移植代码是非常复杂的并且要花费大量时间,由于数据库供应厂商都使用他们本人专有的过程言语(例如Oracle使用PL/SQL,而Sybase和SQL Server使用Transact - SQL)。
近几年来,Oracle开发人员都不断在使用PL/SQL|(一种提供了到关系数据库言语SQL的过程扩展部分的言语)来构建管理大量的数据阵列的复杂系统。不幸的是,用PL/SQL写的存储过程只能在Oracle数据库运转。但是SQL开发者有了一种写代码的强无力的工具,可以很容易的移植到其他的数据库-这就是Java,由于它在跨平台开发和国际互联网络上的强大功用是它成为流行的开发言语。Java承诺的统一的、可移植的使用软件开发处理办法可以在简单的、低成本的的IT基本设备上执行,所以次要的开发工具供应厂商和设备供应者都支持Java。居于领导地位的软件供应厂商,例如Oracle和IBM,都在他们的数据库和其他的使用程序平台上整合了Java虚拟机(JVM)。ORACLE数据库管理系统公司在Oracle 8i中引入了对Java的扩展支持功用。在Oracle中,有两种使用Java的基本方法:
JDBC :就像ODBC一样,它提供了一个基于驱动程序的接口,允许从Java使用程序中访问Oracle数据库。
SQLJ :这是多个厂商共同努力的结果,是一种新的言语,能提供在Java代码中静态SQL的支持。理论上,它提供了比JDBC更大程度的程序员劳动生产率。
在Oracle 8i数据库服务器里集成JVM是在最近几年中Oracle引进的最重要的技术改造之一。集成JVM的Oracle,叫做JServer(亦称Aurora JVM), 支持两种不同的程序设计模型∶
和SQL集成,允许用户使用Java编写传统的数据库存储过程、函数和触发器。
用于分布式Java组件的事务服务器平台,称作企业JavaBeans,允许程序员开发可反复使用的服务器端使用程序组件。
在本文中,我次要讲述一下在Oracle 8i中SQL和Java集成。也就是说, Java可以调用SQL和PL/SQL,PL/SQL和SQL也可以调用Java。Java程序调用它们使用JDBC驱动程序的SQL和PL/SQL复本,而JDBC驱动程序是嵌入驻留在Oracle 8i数据库中的JVM体系结构中的。另一方面,从SQL和PL/SQL到Java,Oracle 8i提供了二个特色。在Oracle 8i中,Java名称空间映射到数据库模式,易于从属物允许Java被保存在数据库中。Oracle 8i也提供扩展的Data Definition Language(数据定义言语DDL),例如CREATE PROCEDURE AS JAVA命令,因此Java代码很容易内嵌入Oracle 8i中。
SQLJ是什么?
SQLJ是一种允许把静态的 SQL语句以文本方式嵌入Java程序中的言语。在写一个SQLJ使用程序时,我们编写一段Java程序然后遵照某些特定的标准法则把SQL语句嵌入在其中,这些法则定义了SQL语句怎样写入Java程序(具体情况请看Oracle 8i SQLJ开发指南与参考,你可以在Documentation Library光盘上找到)。
接下来,我们运转一个SQLJ翻译器,通过把嵌入式结构化查询语句替换为调用调用SQLJ运转时程序库的方式把SQLJ程序转换成一个标准的Java程序。生成的Java程序就可以使用任何标准的Java编译程序(例如javac)来编译了然后就可以配合数据库使用了。SQLJ运转期环境是由一个瘦(即没有额外系统开销)SQLJ运转时程序库组成,也就是说用纯Java实现调用相应的数据库(Oracle, DB2等等)的JDBC驱动程序。
SQLJ类似于其他的嵌入式结构化查询言语的实现,像Oracle Pro * C (嵌入C言语环境的SQL)。SQLJ言语设计的目的就是协助基于Java的程序员构建数据库使用程序。SQLJ是一个ISO和ANSI标准,也就是说由领头的数据库与软件供应厂商开发和支持的,包括ORACLE数据库管理系统公司,国际商业机器公司,美国赛贝斯公司, Informix公司,美国康柏公司等。所有这些公司合作开发兼容的SQLJ翻译器来实现使用不同的数据库。
SQLJ的优点
一个编译过的SQLJ使用程序是一个标准的Java程序,可以在任何具备三个组件的环境中运转,这三个组件是:JVM, SQLJ运转时程序库和JDBC驱动程序。
它提供了下列好处∶
紧凑的代码 SQLJ代码比JDBC代码愈加紧凑并且无差错。在编译时对语法和语义进行检查。SQLJ编译器提供了类型检查和模式对象检查来找出在SQL语句中的语法错误或脱漏或拼错这样的错误,这是在编译过程中进行而不是在运转过程中进行。因此,使用SQLJ编写的程序比使用JDBC编写的程序愈加健壮。
多厂商互用性 SQLJ语法是由次要的软件供应厂商开发和支持的。由于SQLJ程序使用运转时JDBC调用访问数据库,所以SQLJ可以访问任何JDBC驱动程序可以实现的数据库服务器。
灵活的部署 由于SQLJ运转时程序库是基于Java的程序,所以SQLJ使用程序可以在任何JDBC配置环境中配置,例如瘦客户端,两头层或是数据库服务器上等。
供应厂商具体定制 SQLJ通过后续的Java字节码的定制支持供应厂商具体产品的特色和扩展。它可以被用来改善SQL查询言语的执行功用,使器具体供应厂商提供的功用或功用上的扩展,而不用考虑SQLJ程序如何变化,以及调试和运转记录等情况。
使用SQLJ的开发步骤
下面是开发和运转一个SQLJ使用程序所需求做的事情:
使用SQLJ编译器编译SQLJ源文件。这一步生成调用SQLJ运转时的Java文件,以及二进制的SQLJ描述文件--包括存在于SQLJ源文件中的静态SQL语句的有关信息。使用Java编译程序编译Java代码。在编辑完成之后,生成的描述文件是使用特定数据库数据类型,扩展和特征功用定制的。
运转使用程序,使用SQLJ运转时程序库和特定数据库的JDBC驱动程序。举例来说,如果你的主.sqlj文件定义类MyClass,那么源文件名必须是MyClass.sqlj。编译器生成MyClass.java源文件,然后编译程序生成MyClass.class类文件。而且,翻译器和编译程序两者都生成profile - key类,MyClass_SJProfileKeys.class。翻译器依据你怎样声明它们来命名迭代程序类与连接上下文类。举例来说,如果你声明一个迭代程序,MyIter,将生成一个MyIter.class类文件。
下面是配置SQLJ的必要条件∶
SQLJ运转时程序库
JDBC驱动程序,例如:JDBC/ODBC桥,Oracle JDBC/OCI驱动程序,Oracle瘦JDBC驱动程序,DB2 JDBC驱动程序等等。
SQLJ程序将执行的JVM
如今让我们比较SQLJ和JDBC,并比较SQLJ/JDBC和PL/SQL。
SQLJ 与JDBC
SQLJ开发的目的是完善动态JDBC SQL结构化查询言语模型和静态的SQL结构化查询言语模型。与ODBC和JDBC动态模型不同,静态模型提供强类型使用程序翻译时间检查。这些不只要求进行SQL语法的编译时检验和SQL语句使用的主机变量的类型兼容,而且查询本身的正确性与数据库模型中的表,视图,存储过程等等的定义有关。由于所有的SQL语句都要被编译,SQLJ可以作为一个功用更好的两头媒质。
SQLJ代码与JDBC代码
对于有输入参数的SQL语句,SQLJ类通常比等价的动态的SQL语句( JDBC)调用简短,由于SQLJ运用主机变量把参数传递到SQL语句中,当JDBC要求一个单独的语句把个个参数捆绑起来,检索每个结果。下面是一条SELECT语句的SQLJ代码片断:
String vName; int vSalary; String vJob; Java.sql.Timestamp vDate;
...
#sql { SELECT Ename, Sal
INTO :vName, :vSalary
FROM Emp
WHERE Job = :vJob and HireDate = :vDate };
下面是相反的SELECT语句的JDBC代码碎片:
String vName; int vSalary; String vJob; Java.sql.Timestamp vDate;
...
PreparedStatement stmt = c