文章说明:黑色字体-已知,蓝色字体-所见即所得,红色字体-还需要再找资料弄明白的,黄色背景-提炼关键信息
参考资料:很多参考资料,段落下有原文链接到原作者
简介
在Oracle中,有两种使用Java的基本方法:JDBC、SQLJ。
JDBC :就像ODBC一样,它提供了一个基于驱动程序的接口,允许从Java应用程序中访问Oracle数据库。
SQLJ :这是多个厂商共同努力的结果,是一种新的语言,能提供在Java代码中静态SQL的支持。理论上,它提供了比JDBC更大程度的程序员劳动生产率。
在Oracle 8i数据库服务器里集成JVM是在最近几年中Oracle引进的最重要的技术革新之一。集成JVM的Oracle,叫做JServer(亦称Aurora JVM), 支持两种不同的程序设计模型∶
1.和SQL集成,允许用户使用Java编写传统的数据库存储过程、函数和触发器。
2.用于分布式Java组件的事务服务器平台,称作企业JavaBeans,允许程序员开发可重复使用的服务器端应用程序组件。
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运行时的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 = connection.prepareStatement(
"SELECT Ename, Sal " +
"INTO :vName, :vSalary " +
"FROM Emp " +
"WHERE Job = :vJob and HireDate = :vDate");
stmt.setString(1, vJob);
stmt.setTimestamp(2, vDate);
ResultSet rs = stmt.executeQuery();
rs.next();
vName = rs.getString(1);
vSalary = rs.getInt(2);
rs.close();
我们可以看到,直接在一个Java程序中嵌入SQL语句能够生成比JDBC更加简明易读的代码。因此,SQLJ在Java应用程序有数据库访问需要的时候,减少了开发时间和维修代价。SQLJ程序可以在同一个源文件中很容易地与JDBC代码相互作用来做到动态的SQL语句调用,或者你也可以在SQLJ语句中使用PL/SQL语句块来完成这个目的。此外,Oracle 9i增加了在SQLJ代码直接支持动态SQL的功能。
Java ( SQLJ和JDBC)与Oracle数据库中的PL/SQL比较:
Oracle数据库应用程序中的使用的Java还不能够替代PL/SQL。Java和PL/SQL相辅相成,Java ( SQLJ/JDBC)有下列优于PL/SQL的地方:Java能够提供重要的性能优势,Java存储过程要快5到100倍,这主要取决于程序中使用的数学操作符和数据类型。理论上说,Java存储过程可以很容易的转化成运行在其它数据库上的存储过程。Java程序可以在一个复杂的应用程序的任何一层上配置∶在客户端上,在中间层的应用程序服务器上或者在数据库服务器本身中。Java ( SQLJ/JDBC)也同样“分享”了PL/SQL的不足之处:PL/SQL与Oracle数据库服务器紧密地结合起来,Oracle在近20年的时间中不断的改进PL/SQL,而Java只在1998年的时候才被引进Oracle 8i。PL/SQL数据类型等价于Oracle本地数据类型,所以不需要进行数据类型的换算。在另一方面,JDBC提出在Java代码和SQL语句之间插入一个普通的层,而SQLJ是又一个层。PL/SQL工作性能比Java好,因为是以数据库为中心编程:PL/SQL存储过程比Java程序快1.5倍(对于OLTP联机事务处理)到2.5倍(用于批处理)。此外,Java程序要使用比PL/SQL更多的CPU资源。CPU额外开销的增加可能是因为要进行一个比较长的编码过程以及从Oracle到Java的额外的数据类型转换。
一个两者兼顾达到最好效果的解决方案
Oracle提供了一个理想的环境用于利用PL/SQL和Java语言两者的优点。在一方面,PL/SQL程序可以调用SQLJ和JDBC存储过程,允许你构建基于组件的EJB和CORBA应用程序。现有的Java类库可以很容易地被利用,并通过使用PL/SQL调用规范来整合入数据库代码开发过程中。在另一方面,Java程序可以通过JDBC或者SQLJ调用PL/SQL存储过程,函数和匿名的程序块。我下面想一一详细介绍,SQLJ提供用于调用下面这些内容的语法:
存储过程:使用CALL操作符调用UpdateSalary程序∶
#sql ...{ CALL UpdateSalary };
函数:<0} ...{0>to call the GetName() function using the VALUES operator: <}0
...{0>String name; <}0...{>String name;<0}
#sql ...{ name = ...{ VALUES GetName() };
or by using the SET operator:
String name;
#sql ...{ SET :name = GetName() };
...{0>Anonymous PL/SQL blocks: <}0
#sql ...{ [DECLARE ...] BEGIN ... END; };
需要注意的是影响决定使用什么语言的因素,不仅由执行效果决定–说得更精确些,一个现今应用程序开发过程中的主要因素,而且由程序员劳动生产率、可获得的专家的意见和轻便性决定。幸亏对于数据库开发人员,不必在几种语言中选来选去,你可以很容易地把Java ( SQLJ和JDBC)与PL/SQL存储程序混合搭配进一个数据库来取得一个两者兼顾达到最好效果的解决方案。
SQLJ语言元素
SQLJ是正在发展的工业标准语言,允许你使用独立于数据库代码的Oracle存储过程,可以很容易地移植到其他的可使用Java的数据库平台。知道连接上下文,迭代程序,可执行语句和主表达式的情况,那么你就可以把一些实际的SQLJ语句用到现实的应用程序中。
在前文中,我描述了SQLJ是什么,比较了PL/SQL和JDBC,并且研究了SQLJ的好处。 在本文中,我将研究一下SQLJ编程语言的基础,这样你就可以在现实的应用程序中使用SQLJ了。SQLJ程序是一个使用嵌入式结构化询问语言语句的规则的Java程序,以一个#_sql标记开始并以一分号结束。有二类SQLJ语句∶声明和可执行语句。声明语句声明了连接上下文和迭代程序。连接上下文用来建立数据库连接,而迭代程序被用来存储由SQL查询返回的结果集;可执行语句执行嵌入式结构化询问语句和PL/SQL程序块。因为SQLJ程序将要被翻译然后通过JDBC运行,任何JDBC驱动程序支持的SQLJ语句可能内嵌在一个SQLJ可执行语句中。可执行语句可能同时包含主表达式,在Java程序和数据库之间通过Java变量交换信息。
原文链接:https://blog.youkuaiyun.com/herrcx/article/details/2065334?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522158401200719726867836785%2522%252C%2522scm%2522%253A%252220140713.130056874…%2522%257D&request_id=158401200719726867836785&biz_id=0&utm_source=distribute.pc_search_result.none-task