1. 介绍
许多开发者和用户都在寻找Java程序中访问数据库的便捷方法。由于Java是一个
健壮,安全,
易于使用的,易于理解且可以从网络中自动download ,所以它成为开发数据库应
用的一种良
好的语言基础。它提供了C,C ,Smalltalk, BASIC, COBOL, and 4GLs的许多优
点。许多公司
已经开始在Java与DBMS的连接方面做工作。
许多Java应用开发者都希望能够编写独立于特定DBMS的程序,而我们也相信一个
独立于DBMS的
接口将使得与各种各样DBMS连接变得最为便捷,开发更加迅速。所以我们认为定
义一个通用的
SQL数据库存取框架,在各种各样的提供数据库连接模块上提供统一的界面是十分
有意义的。这
使程序员可以面对单一的数据库界面,使数据库无关的Java工具和产品成为可
能,使得数据库连
接的开发者可以提供各种各样的连接方案。我们看到我们定义一个通用低层的,
支持基本SQL功能
的Java DataBase Connectivity (JDBC)API的紧迫任务。
幸运的是我们不必从头设计一个SQL API。我们可以把我们的工作建立在 X/Open
SQL CLI (调用
层接口)之上(它也是Microsoft's ODBC 的基础)。
我们主要任务是定义一个自然的Java接口来与X/Open CLI中定义的基本的抽象层
和概念连接。
JDBC API得到数据库开发厂商,连接开发厂商,ISV,以及应用开发者的支持是十
分重要的。我们
相信把我们的工作建立在ODBC抽象层的基础上将JDBC更加容易得到大家的接受。
而且从技术上来说,
ODBC是我们设计工作的一个良好基础。
因为ODBC是一个C语言接口,所以ODBC在Java中直接使用不适当。从Java中来调用
C代码在安全性,
健壮性,实现的方便,可移植性等等方面有许多不便。它使得Java在这些方面的
许多优点得不到
发挥。
我们已经在短期里面实现了一个建立在ODBC上的API。长远来看,我们可以通过其
他方式提供实现。
1.1. 注意
我们非常感谢在数据库,数据库连接和数据库工具领域的许多早期的工作者。他
们为JDBC的早期草案
提供了很好的意见和建议。他们的工作对本规范起了不可估量的作用。
2. 目标与哲学
这个部分描述了指引这个API开发的目标以及哲学。
2.1. SQL 级 API
我们的主要目标是为Java定义一个“调用级”(call-level)的SQL接口。着意味着
我们主要的注意力
集中在执行原原本本的SQL语句并且取回结果。我们预计高层的API也将被定义,
这些可能将建立在基
层的接口上。这些高层接口包括象直接地、透明地把表里面的数据影射到Java类
里面,用语法树表示
更加通用的查询,以及Java内嵌的SQL语法。
我们希望大量的应用开发工具将使用我们的API。然而我们也希望程序员能够使用
我们的API,尤其是
目前这样在Java里没有任何其他手段(应该是说数据库访问手段)的情况下。
2.2. 遵循SQL
数据库系统支持各式各样的SQL语法和语义,它们相互之间在比较高级的功能例如
外部连接,内嵌过程
等方面并不一致,尽管我们能够盼望着随时间的推移这些部分的SQL可以获得标准
化。同时我们采取这
样的态度与立场:
In fact, an application query need not even be SQL, or it may be a
specialized
derivative of SQL, e.g. for document or image queries, designed for
specific DBMSs.
In order to pass JDBC compliance tests and to be
called "JDBC COMPLIANT ?" we require that a driver support at least
ANSI SQL-2 Entry
Level. This gives applications that want wide portability a guaranteed
least common
denominator. We believe ANSI SQL-2 Entry Level is reasonably powerful
and is reasonably
widely supported today.
l JDBC允许查询表达式直接传递到底层的数据驱动,这样一个程序可以获得尽量
多的SQL功能,但是可
能被DBMS拒绝。事实上,一个程序的查询甚至可以不是SQL的,或者是SQL的一个
特殊演化,例如:
为专门数据库设计的文本或者图形查询。
l 为了通过JDBC兼容的测试,并且能够被称为JDBC兼容,我们要求一个驱动至少
支持ANSI SQL-2的标
准。这使得那些需要广泛移植性的程序获得一个最小的分母(这句话的原文是:
This gives
applications that want wide portability a guaranteed least common
denominator.)。
我们相信ANSI SQL-2是足够强大的,并且是得到足够支持的。
2.3. JDBC必须可以建立在现有的数据库接口上
我们必须能够保证 JDBC SQL API 能够建立在普通的SQL API上,尤其是ODBC。这
些要求已经对这个
规范的一些部分产生了影响,尤其是对传出参数(OUT parameter)和大数据块的处
理。
2.4. 必须保证这个接口与JAVA系统的其他部分保持一致
目前对JAVA的积极回应已经十分热烈。很大程度上是由于这个语言标准以及标准
运行时库被认为是一
致,简单和强大的。我们将尽我们所能,提供这个Java数据库接口,这个接口将
建立在Java内核现有
的这种风格,并且将进一步加强它。
2.5. 保持简单
We would prefer to keep this base API as simple as possible, at least
initially. In
general we would prefer to provide a single mechanism for performing a
particular task,
and avoid provid-ing duplicate mechanisms. We will extend the API later
if any
important functionality is miss-ing.
我们将力争使得基本的API尽量简单,至少开始的时候是这样的。一般来说,我们
希望对实现每个特定
的任务只提供一种方案,而避免提供多种方案。如果一些重要的功能遗漏了,那
么我们在晚些时候将扩
充这个API。
2.6. 尽量保持强的、静态的类型
我们希望这个JDBC API保持尽量强的类型检查,使得尽可能多的类型信息可以静
态地表达。着使得尽
可能多的错误可以在编译的时候被发现。
由于SQL本身是动态类型的,所以我们可能会在程序运行的时候遇到类型不能匹配
的问题。例如:
当一个程序员在希望SELECT返回一个整数,但是实际返回的是一个字符串
“foo”.但是我们依然希望
程序员把他们所希望的类型在编译的时候就能够表达清楚,这样我们可以做尽可
能多的静态检查。
我们也希望在必要的时候能够支持动态类型接口(见第四章)
2.7. 使普通任务简化
我们希望普通的任务能够是简单的,而不一般的工作是可行的。
一个普通任务是指一个程序员执行一个简单的没有参数的SQL语句(例
如:SELECT,INSERT,UPDATE,DELETE),
然后(例如SELECT)处理返回的具有简单类型的元组。一个具有传入参数(IN
parameter)的SQL语句
也是普通的。不那么普通但是也是十分重要的情形是当程序员使用有INOUT,OUT参
数的SQL语句。我们
也需要支持读写几兆字节对象的SQL语句,更特别一些的情形包括一个语句返回了
多个结果集合。
我们希望元数据(Meatdata)的使用很少的,只是那些熟练的程序员以及开发工具
才需要处理的问题。元
数据存取函数以及动态类型数据存取函数在这个文档末尾,一般的程序员可以不
必关心这些章节。
2.8. 不同的功能让不同的方法(函数)来实现
(“方法”的原文是:method,这样翻译是跟VB的)一种界面设计风格是使用很
少的过程,提供许多作
为参数传递的控制标志,这样它们可以用来影响很大一个范围内的各种行为。来
表达不同的功能。这
趋向与使用很多的方法,但是每个方法都比较同意理解。
一般来说,Java内核类使用不同的方法(method)。这个步骤的主要优点是开始
学习基本界面的程序
员可以不必被那些与复杂功能相关的参数所困扰。我们力图在JDBC接口上也采用
相同的策略。一般来
说采用不同的方法而不是采用不同的标志和多用途的方法。
3. 接口概貌
接口分为两个层次,一个是面向程序开发人员的JDBC API。另外一个是底层的
JDBC Driver API。
3.1. JDBC API
JDBC API 被描述成为彝族抽象的Java接口,似的应用程序远可以对某个数据库打
开连接,执行SQL
语句并且处理结果。错误! 嵌入对象无效。
最重要的接口是:
l java.sql.DriverManager 处理驱动的调入并且对产生新的数据库连接提供支
持。
l java.sql.Connection 代表对特定数据库的连接。
l java.sql.Statement
代表一个特定的容器,来对一个特定的数据库执行SQL
语句。
l java.sql.ResultSet
控制对一个特定语句的行数据的存取。其中
java.sql.Statement
又有两