摘要
JDK1.1包括了新的数据库存 取(JDBC)及组件(JavaBeans)的应用程序接口(APIs)。这两个API结合在一起,可用来开发通用 数据库代码。通过用唯一的一个类去存取任何一种JDBC数据库(封装于不同组件中的各个应用 程序有着其具体的编码),用户就不必因为数据库结构一点点的细小变化去修改数据库编码。
一个关系数据库基本上包括一系 列相互关连的表,在每一个表中存有一类与应用系统相关的数据。例如一个地址簿数据库中,可 能有关于人员、住址、电话号码等方面的表。在数据库中,每一个这样的实体将被作为一系列的 字符串,整数及其它原始数据类型存贮起来。数据库中,表的定义将描述每一种与实体相关的信 息如何在一个表的字段中存储。例如,你可以在一个名为“人”的表中,有两个字段别表示所存字 符串为“姓”和“名”。每一张表应当有一个或几个字段值作为标识,确保每条记录的唯一性。这些 标识或“键”可以用来连接存在于不同表中的信息。例如你可以在“人员”表中,为每个人指定唯 一的“人员号码”的键值,并在“地址”表中的相应字段中使用同一个键值。这样,你可以通过对两 个表中的“人员号码”字段值的匹配,使每一个人和他的地址关联起来。
关系数据库系统出现于七十年代, 时至今日,它仍然是存储巨量数据的主要方式。因而,Java软件工具有必要具备处理关系数据库 的能力。
关系数据库要想被某个Java应用 程序利用,首先需要解决两个问题。第一:需要某些基础的中间件来建立与数据库的连接,向数 据库发出SQL查询等等;第二:操纵数据库的处理结果要与操纵任何一种Java信息一样方便—— 作为一个对象。前一个问题已被SUN及几个数据库产商解决;后一个问题则有待我们进一步去探 究。
在为普通的程序开发业务定义大 量的APIs这项工作上,SUN一直保持着与许多软件公司的合作关系。在JDK1.1APIs中,JDBC 的API是最早建立起来的。而且,它已得到了为数众多的应用。这些应用中,有的是100%的 纯Java,有的则是Java和其它程序的混合体,如:用现有的ODBC数据源进行连接(参看 图1)。JavaSoft已将一个关于现有的JDBC驱动程序的介绍放在它的Web站点 上(http://splash.javasoft.com/jdbc/jdbc.drivers.html)。
图1一个典型的JDBC或JDBC/ODBC配置
注意:此图已被简化。另外的组件 已包括其中(如ODBD驱动程序)
非常明显,这些应用的优缺点取决 于你的环境和设置,在此我不准备对它们的各种情况进行逐一论述。在下面的内容中,我们假 定,在你的机器中已拥有某种Java开发环境,并且你已正确地安装并测试过某个JDBC驱动程序, 或者运用过某种JDBC驱动程序及SUN的JDBC/ODBC桥。
JDBCAPI
JDBCAPI作为一个单独的Java 包(或类库,即java.sql)出现,包括有一系列的类。这些类提供了处理某个关系数据库的中间 件。本质上讲,它们使得你可以关联某个数据库,并向其发出查询。你可以对这些查询结果进行 处理,检索你数据库的meta-信息(meta-information),并且处理在此间可能发生的各种异常情况。
让我们来看一个简 单的JDBC例子,看一看应用了JavaJDBC之后,查询会得到怎样的简化。表1是一个极其简单的数 据库。在清单1中的编码是一段最简单的对关系数据库进行SQL查询所需的Java语句。
人员 # | 名 | 姓 |
43674 | Sandor | Spruit |
90329 | John | Doe |
65435 | Donald | Duck |
String ur1="jdbc:odbc:sample";
String query="SELECT * FROM PERSON";
boolean more;
try
{
Class.forName("sun.jdbc.odbc.jdbcOdbcDriver");
Connection con = DriverManager.getConnection(ur1,"sandor","guest");
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(query);
While (more = rs,next())
{
int number = rs.getInt("PERSON#");
String firstName = rs.getString("FIRST_NAME");
String lastName = rs.getString("LAST_NAME");
System.out.printIn(number + " " + firstName + " " + lastName);
}
rs.close();
stmt.close();
con.close();
}
catch(SQLException ex)
{
ex.printStackTrace();
}