[摘要][内容提要] 本文详细介绍了Java数据库编程的JDBC API及java.sql包。并以 Java 技术设计、开发、实践的一个数据库应用管理系统案例为模板,结合 Java2 平台程序进行说明 Java 面向对象的语言的开发思路、语言特色、安全机制以及案例的具体实现步骤、方法及过程等。相信通过本文...
[内容提要] 本文详细介绍了Java数据库编程的JDBC API及java.sql包。并以 Java 技术设计、开发、实践的一个数据库应用管理系统案例为模板,结合 Java2 平台程序进行说明 Java 面向对象的语言的开发思路、语言特色、安全机制以及案例的具体实现步骤、方法及过程等。相信通过本文的介绍,广大的开发者会领略 Java 面向对象语言的风采,深深体会 Java 的开发思想。从而为广大用户提供另外一种高效的、前瞻性的管理信息系统及Live Intranet解决方案。
[关键词] OOP NC JDBC APPLET APPLICATION MIS Live Intranet
Java 语言是Sun MicroSystems 公司于1995年正式命名并推出的一种面向对象的编程语言-OOP(abbr.Object Oriented Programming)。Sun 公司说:Java 程序设计语言被设计成是 by programmers for programmers,其随着 Internet 的发展而广为流行。用它开发的系统“一次开发,到处运行”的特色以及程序开发设计时所体现出的面向对象的思想深深地触动着人们。它的语言简洁、集多种程序设计语言之大成,且面向对象、具有可移植性、分布性、安全性、高性能等特色。Java在向Internet/Intranet,甚至计算机世界的各个领域渗透,慢慢改变着人们的思维。而今Internet 热浪一浪高过一浪,从外部世界走向企业内部形成Intranet,促进了Java 技术的利用开发。计算机业界中的IBM、ORACAL 、APPLE、Sun、Netscape五家公司还联合推出“网络计算机(NC-1)”规范。抛开“Wintel”臃肿不堪的体系结构,使用户端价格低廉、易于使用,并成为能够连接网络的简单计算机-NC(Network Computer),即所说的“瘦客户”机,NC 支持Java 虚拟机(JVM),能够运行Java开发的应用程序(Application)和小程序(Applet)并支持多媒体应用。NC 和Java 的结合诞生了新的时代:网络计算机时代。就连Sun的冤家对头Microsoft的比尔.盖茨也不得不承认:“Java是长时间以来最卓越的程序设计语言”。
一、 Java 数据库基础 JDBC API
Java语言在数据库应用方面,特别在基于Web 的B/S结构的在线数据库应用方面的烦琐复杂配置等,并不能使用户和程序开发双方都十分满意。SunSoft虽提供了用Java语言编写成的Java与数据库的接口规范JDBC(Java DataBase Connectivity,而JavaSoft说JDBC并不代表什么),使Java程序可以通过统一标准规范的JDBC API来与不同的数据库通信。确保了“100%纯Java”的解决方案。JDBC API 定义了Java中的类和接口,表示数据库连接、SQL 指令、结果集合等。它允许Java程序员发送SQL 指令并处理结果。JDBC API 提供两种主要接口:一是面向开发人员的java.sql程序包,使得Java程序员能够进行数据库连接,执行SQL查询,并得到结果集合。Java2 的java.sql包提供了6个类和18个接口,下文将介绍;另一是面向底层数据库厂商的JDBC Drivers ,目前为止,Java2的JDBC Drivers仅提供下述四种类型的数据库驱动方式,且各有利弊:
(1) JDBC-ODBC bridge plus ODBC driver 方式:JDBC-ODBC 桥接方式利用微软的开放数据库互连接口(ODBC API)同数据库服务器通讯,客户端计算机首先应该安装并配置ODBC driver 和JDBC-ODBC bridge两种驱动程序。这是Applets访问你的数据库最可能的解决方式,但这对Internet 和Intranet 用户而言简直是一个非常令人讨厌和麻烦的解决方案。
(2) Native-API partly Java driver方式:这种驱动方式将数据库厂商的特殊协议转换成Java代码及二进制类码,使Java 数据库客户方与数据库服务器方通信。例如:Oracle用SQLNet协议,DB2用IBM 的数据库协议。数据库厂商的特殊协议也应该被安装在客户机上。这也是令人讨厌和麻烦的解决方案。
(3) JDBC-Net pure Java driver方式:这种方式是纯Java driver。数据库客户以标准网络协议(如HTTP、SHTTP)同数据库访问服务器通信,数据库访问服务器然后翻译标准网络协议成为数据库厂商的专有特殊数据库访问协议(也可能用到ODBC driver)与数据库通信。对Internet 和Intranet 用户而言这是一个理想的解决方案。Java driver 被自动的,以透明的方式随Applets自Web服务器而下载并安装在用户的计算机上。
(4) Native-protocol pure Java driver方式:这种方式也是纯Java driver。数据库厂商提供了特殊的JDBC协议使Java数据库客户与数据库服务器通信。然而,将把代理协议同数据库服务器通信改用数据库厂商的特殊JDBC driver。这对Intranet 应用是高效的,可是数据库厂商的协议可能不被防火墙支持,缺乏防火墙支持在Internet 应用中会存在潜在的安全隐患。
综上四种方式中,只有第三、四种方式的驱动支持 Applet的零安装。因为JDBC drivers 完全用Java 写成,并从Web 服务器上随applet下载。为了支持零安装,驱动程序应该被放在Web上,并与applet 在相同目录。而第四种存在安全隐患,第三种产品为数不多,现今较成熟的IDS JDBC driver属于此种(http://www.idssoftware.com),但也要用到ODBC driver辅助。
即便如此,利用Java技术开发单机环境应用程序,局域网范围或Intranet环境下的应用程序、动态Web应用(Live Intranet)等,Java语言是高效、安全、稳定的。Java语言已赢得了众多厂商的支持,基于其上的Java API-JDBC也发展迅速。Sun承诺任何Java Applet 或Java应用软件都能够与数据库结合,并且仍将不遗余力的支持未来Java技术的发展。Java语言的跨平台特性,使之成为Internet和Intranet环境下开发数据库应用系统的理想选择方案。
二、 Java 数据库应用系统的实现
基于此,笔者用Java 2 SDK,Standard Edition Version 1.2.1版本为开发工具,以已经成功开发的Java数据库应用系统案例为模板,结合Java2程序语句及java.sql包,介绍一下Java数据库应用系统开发的具体实现步骤、方法等。
1.设置数据库的连接
为了利用JDBC,你将需要一个数据库服务器和一个数据库驱动器。因为大多数读者的计算机已经安装了Windows95/98,我就用微软的 Access 97做为我的数据库服务器(具体为Action.mdb),当然你也可以用其它的数据库作为数据库服务器。因为对JDBC而言,数据库服务器的类型无关紧要,JDBC会提供一个独立于数据库服务器的访问数据库的方法。这是JDBC的主要优势所在。
你将还需要一个数据库驱动器,用来提供JDBC与你的数据库的连接。作者选用了较可能的JDBC-ODBC bridge 方式。为此需设置32-bit ODBC的数据源,选择System DSN(数据可被多用户访问,User DSN不同),增加新的数据源,配置新数据源的路径为Action.mdb数据库服务器的所在位置。
安装完成,Java程序员可以进行编制程序的阶段。首先程序员引用java.sql 包中相应的类与接口来进行对JDBC驱动器的管理:用Class 类中的 forName() 方法装入 JDBC驱动器,以JDBC-ODBC bridge 方式为例,装入JDBC驱动执行的语句为Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);用DriverManager 类中getDrivers()方法返回所有安装在你的计算机中的JDBC驱动器,getConnection()建立与数据库的连接等。getConnection()方法提供下面三种形式:
getConnection(String url)
getConnection(String url,String userID,String password)
getConnection(String url,Properties arguments)
其中字符串url表示数据库服务器所在处的特殊的URL。URL是被用来与不同的数据库驱动建立连接的统一网络资源,其形式如下:
jdbc:subprotocol:subname
所有的JDBC数据库协议开始于jdbc:。Subprotocol是被用来辨别JDBC驱动方式的。例如:JDBC-ODBC bridge 用jdbc:odbc:subname 这种用户协议形式,IDS JDBC driver 用jdbc:ids:subname 形式。数据库协议的subname标识数据库并且与subprotocol 和JDBC驱动方式有关。例如,以JDBC-ODBC bridge方式,我用下面的URL形式建立与数据源Tend建立连接:
jdbc:odbc:tend
getDrivers()和getConnection()方法是DriverManager类中最重要的方法,还有其它一些方法在此略。
2.与数据库进行连接
用DriverManager类的getConnection() 方法建立起与数据库连接,getConnection()返回一个对象,此对象是java.sql包中的Connection 接口对象。该接口定义了与之连接的数据库交互的一些方法、常量等,这些方法用来管理数据库的连接、获得连接的信息、提交数据库处理事件并且预处理可执行的SQL语句。下面是Connection 接口的一些重要的方法:
close()-关闭一个数据库连接
getMetaData()-返回一个DatabaseMetaData 接口对象,该接口能被用来获得有关数据库的详细信息,包括数据库结构和数据库内容等。
createStatement()-创建一个SQL语句对象。
prepareStatement()-用SQL字符串创建一个SQL 预处理语句对象。预处理语句对象是可以被高效执行的预编译过的SQL语句。
下面提供一段程序,实现了JDBC的驱动及数据库的连接,供参考:
import java.sql.*;
import java.util.*;
class ConnectApp {
public static void main(String args[]) {
try{
// Load the JDBC-ODBC bridge driver方式
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String url="jdbc:odbc:tend";
// 连接到数据库
Connection connection=DriverManager.getConnection(url);
// 得到数据库的信息
DatabaseMetaData meta=connection.getMetaData();
3.利用结果集工作
数据库查询被执行后,查询的结果作为一个两维(行、列)数据表返回。ResultSet接口被用来提供访问查询结果的数据表,查询结果被当作ResultSet对象而返回,ResultSet对象提供“指针”,指针每次访问数据库表的一行。当ResultSet对象从查询中返回时,指针初始指向数据表的第一行,ResultSet 的next() 方法用来移动指针到数据表的下一行,如果到达表尾,next() 方法返回假的布尔值-false,否则为真。ResultSet接口提供大量的获得数据的方法,这些方法返回数据表中任意位置的数据,不论是基本数据类型或引用数据类型的数据。getMetaData()方法返回ResultSetMetaData接口对象,该对象包含数据表行的信息。ResultSetMetaData 接口提供变量和从ResultSet对象获取信息的方法,getColumnCount() 方法返回数据表的列数,getColumnName() 方法返回提取的数据库中的列名称,即数据库字段名,getColumnType() 方法返回列的SQL类型,ResultMetaData中其它的方法被用访问列的额外属性,如列的显示宽度、数据格式及读/写状态等。注意ResultSet中的列其始索引号为1而不是0。下面提供一段程序:
static void displayResults(ResultSet r) throws SQLException {
// 获得数据结果集合
ResultSetMetaData rmeta = r.getMetaData();
// 确定数据集的列数,亦字段数
int numColumns=rmeta.getColumnCount();
// 输出每一个数据值
for(int i=1;i<=numColumns;++i) {
if(i<numColumns)
System.out.print(rmeta.getColumnName(i)+" ");
else
System.out.println(rmeta.getColumnName(i));
}
while(r.next()){
for(int i=1;i<=numColumns;++i) {
if(i<numColumns)
System.out.print(r.getString(i)+" ");
else
System.out.println(r.getString(i).trim());
}
}
}
4.执行SQL语句
SQL代表着结构化查询语言,即 Structured Query Language的缩写。SQL是用来同数据库服务器交互的一种语言。SQL被IBM在70-80年代开发,80年代后进行了标准化。但标准已经更新,现已出现好几个版本。另外一些数据库厂商也增加扩展了一些特殊的功能语句等。JDBC需要与JDBC兼容的SQL驱动支持,即支持ANSI SQL72标准。SQL有很多用途,当SQL语句被用来创建、设计数据库时,它是一个数据定义语言;当用来向数据库插入信息、更新或删除已经存在的信息时,它是一个数据维护语言;当从数据库中查询提取信息时,它是数据查询语言。有关SQL语句的一些语法规则,请参考有关书籍,在此略。Java语言设计java.sql 包的目的就是让你执行符合Java的SQL语句。java.sql中的Statement 接口定义了一些方法,这些方法通过SQL语句的执行来与数据库交互,也支持通过ResultSet对象返回查询结果集合的处理和提供查询处理机制的控制。execute()、 executeQuery() 和executeUpdate() 方法是Statement接口的主要方法。executeQuery() 方法执行一个 SQL语句(如SELECT语句等)并查询返回一个ResultSet对象。executeUpdate() 方法执行一个SQL 语句 (如INSERT、UPDATE、DELETE 语句等)并更新数据库、返回SQL查询结果集合的行数(记录数),如果结果集合为空则行数为0。
Java中有关SQL语句的程序片段如下:
import java.sql.*;
import java.util.*;
class ResultApp {
public static void main(String args[]) {
try{
// Load the JDBC-ODBC bridge driver方式
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String url="jdbc:odbc:tend";
// 连接到数据库
Connection connection=DriverManager.getConnection(url);
Statement statement = connection.createStatement();
String sql="SELECT * FROM courses";
// 执行SQL 语句得到结果集合
ResultSet result = statement.executeQuery(sql);
displayResults(result);
// 关闭数据库连接
connection.close();
}catch(Exception ex){
System.out.println(ex);
System.exit(0);
}
}
5.数据库安全性
数据库的安全性问题是很多机构非常关心的问题。因为数据库中可能包含一些比较敏感的信息需要加以限制访问范围;数据的完整性也是极为重要的,未授权的肆意修改数据库信息可能造成公司巨大的损失;数据的有效提供也是重要的,Internet/Intranet用户随时需要信息,这就常常需要提供每天24小时、每周7天的可访问。JDBC支持数据库安全吗?答案不是非常满意。当前JDBC要依靠数据库服务器自身提供安全保护。企业范围的数据库服务器,如微软的SQL Server提供用户ID和口令,然而,即使是口令保护也不是非常安全的,如果口令在客户与服务器之间未加密,它们能很容易被截获而危及安全。
Java的安全机制很高,Java2改进了沙箱,为用户和程序人员提供了灵活的安全管理及配置工具。Applet程序安全性更加灵活,建议利用Java的安全机制及提供的一些工具来进行数据库应用系统的开发。
Java2(JDK1.2)提供的安全工具如下:
用jar工具打包你的applets成为Java 存档文件 (JAR);
用jarsigner对JAR文件进行数字签名;
用policytool对信任applets的Java运行环境Java Runtime Environment (JRE)配置;
用keytool进行数字证书的签证;
三、 Java 的数据库应用开发展望
至此,你已知道:要进行Java 数据库应用程序的设计,需要具备多方面的技能,包括了解或熟练数据库驱动程序、SQL( 结构化查询语言)以及java.sql包所包含的类、接口等。JavaSoft 已经注意到了Java 在数据库程序设计方面的棘手而复杂,他们现在正在开发新的同Java一样容易使用的产品JavaBlend ,该产品将大大简化利用JDBC构建数据库应用系统的过程。JavaBlend 将自动镜像Java 对象成为存储在数据库中的信息。所有对对象的操作,都将产生与之镜像的数据库的动作,包括对存储在数据库中信息的自动查询、更新等。一旦Java 的对象到数据库镜像(Java object-to-database mapping)被成功建立,JavaBlend 将免费发放给Java 程序员,以使Java 程序员从利用繁琐SQL语句、结果集合解决方案过渡到利用JavaBlend 把对Java 对象的方法调用相应地自动转化成SQL语句和结果集合这一简单方案。这将使JDBC和SQL知识在数据库开发时不必考虑过多,而使程序员专心于用户业务方案的提供解决。JavaBlend目前并不包含在JDK 1.2中。
Java 语言及其技术是当今世界程序设计语言的主流。应用Java 技术实现数据库应用系统是未来的发展方向,Java 的数据库应用现已成功地应用于商业、政府及大学等领域,应用才刚刚起步。相信不久的将来,Java 技术将更加完善成熟。Java的数据库应用也将遍地开花。
参考文献:
[1] 《Java 1.2 unleashed》 Jamie Jaworski 1998,Macmillan Computer publishing
[2] 《Java 教程-Internet 面向对象程序设计》 Mary Campione 等著
[3] 《Java语言程序设计》 姜刚等著 1998,人民邮电出版社
[4] 《Web网站的创建、规划、管理及信息发布》 1999,作者
作者简介:
张姝,工程师,毕业于东北大学计算机及其应用专业。现主要从事工程CAD设计及管理信息系统开发工作,是中国电机工程学会会员,曾发表过《网络环境下管理信息系统设计的几点考虑》、《Intranet 环境下事物处理系统的解决方案》、《Web网站的创建、规划、管理及信息发布》等论文。
……