用SQLJ开发数据库(3)
使用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的功能。
(未完待续)