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又有两个子类型:1. java.sql.preparedstatement 用于执行预编译的sql语句。2. java.sql.callablestatement 用于执行对一个数据库内嵌过程的调用。下面的章节对jdbc是如何运行的提供了更多描述,整个定义见第13章。另外第15章描述了系统如果获取数据库的元数据信息。
3.2. jdbc driver api
java.sql.driver在第9章有完整的定义了.大部分jdbc驱动只需要完成这些jdbc api所定义的抽象类就可以了。特别地,所有的driver必须提供对java.sql.connection, java.sql. state-ment, java.sql.prepared-statement, and java.sql.resultset的实现。如果目标dbms提供有out参数的内嵌过程,那么还必须提供java.sql.callablestatement 接口。每个database driver必须提供一个类:java.sql.driver以使得系统可以由 java.sql.drivermanager来管理。一个显然的driver是在odbc之上提供对jdbc的实现,从而提供与odbc接口的jdbc-odbc 桥,就象前面的图所显示的.由于jdbc放在odbc之后,所以实现起来简单而且高效。另外一
闽公网安备 35060202000074号