用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的功能。
(未完待续)
闽公网安备 35060202000074号