1. 介 绍 java
许多开发者和用户都在寻找程java序中访问数据库的便捷方法。由于是download 一个健壮,安全,易于使用的,易于理解且可以从网络中自动,c所以它成为开发数据库应用的一种良好的语言基础。它提供了,c+smalltalk+,, basic, cobol, and 4gls的java许多优点。许多公司已经开始在与dbms的 连接方面做工作。 java
许多应dbms用开发者都希望能够编写独立于特定的dbms程序,而我们也相信一个独立于的dbms接口将使得与各种各样连sql接变得最为便捷,开发更加迅速。所以我们认为定义一个通用的数java据库存取框架,在各种各样的提供数据库连接模块上提供统一的界面是十分有意义的。这使程序员可以面对单一的数据库界面,使数据库无关的工sql具和产品成为可能,使得数据库连接的开发者可以提供各种各样的连接方案。我们看到我们定义一个通用低层的,支持基本功javadatabase 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. * jdbc
允sql许查询表达式直接传递到底层的数据驱动,这样一个程序可以获得尽量多的功dbms能,但是可能被拒sql绝。事实上,一个程序的查询甚至可以不是的sql,或者是的 一个特殊演化,例如:为专门数据库设计的文本或者图形查询。 *
为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口,似的应用程序远可以对某个数据库打开连接,执行语 句并且处理结果。最重要的接口是: * java.sql.drivermanager
处 理驱动的调入并且对产生新的数据库连接提供支持。 * java.sql.connection
代 表对特定数据库的连接。 * java.sql.statement
sql代表一个特定的容器,来对一个特定的数据库执行语 句。 * 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在之 后,所以实现起来简单而且高效。 odbc
另外一个有用的驱动直接接触数据库无关的网络协议。发布一个协议允许多个服务器实现的方法,例如在或dbms者特定的上 (尽管已经有了一些使用固定协议的产品,但是我们不打算对它们实现标准化。),是可取的。
4. jdbc
使 用场合 before looking at specifics of the jdbc api
, an understanding of typical use scenarios is help-ful. there are two common scenarios that must be treated differently for our purposes: applets and applications. jdbc api
在看之applet前了解一下典型的使用场合是有帮助的。通常有两种情形必须分别对待:和application. 4. 1. applet
java
目前使applet用的最多的从网络中下载的,web它们作为文applet件的一个部分。当中有数据库存取和jdbc能够使用来applet接触数据库的。applet例如,一个用户可能下载一个显示股票历史价格图的。applet这个通internet过来 从关系数据库中获得股票历史价格。 applet
最一般的情况里面,对的internet使用是通过不可靠的边界的。例如从另外一个公司或者上applet获得这些。internet于是称这个情况为""applet场合。然而也 可能通过局域网下载。在这个情况里面,客户机的安全都还是一个问题。 applet
典型的在 几个方面与传统的数据库应用程序有所不同: 1
). 不applet可靠的被 严格地限制在他们被允许执行的的操作上。特别地,不允许他们存取本地的文件,切不允许他们对任意的数据库建立网络连接。 2
). 就internet标识和连接网上数据库来说,环applet境里面的面 临新的问题。 3
). 当internet数据库可能与你相隔万里的时候,效率的考虑也有所不同了。与局域网相比,上applet数据库可 能会碰到十分不同的反应时间。 4. 2. application
java
也java可以用来建立普通的应用,从而想一般的应用一样在客户机上使用。我们相信随着开发工具越来越多,人们开始认识到提高程序生产效率的必要性,以及的java其他优点,的java这种用法将越来越流行。在这种方式里面,的 代码是可以信赖的,且被允许读写文件打开网络连接等等,就想其他的应用程序代码一样。 java
也许这些应intranet用使用的最多的是在一个公司内部或者在上intranet,所以不妨成为场java合。例如一个公司希望利用及gui其构java件工具来建立他的基于合作数据模式的合作软件。这些应用程序将存取局域网或者广域网的数据。应 用可以作到这些。 java
应intranet用程序场合和场applet合与场customers合有诸多不同。例如标定一个数据库最自然的方式是用一个数据库的名字,就象"" 和personnel""dbms这样。然后用户希望系统能够定位具体的机器,,jdbc driver,java和应 用程序。 4. 3.
其 他场合
还有其他一些有趣的场合: 1
). 已applet验证的(trusted applets)java是指那些已经被虚applet拟机器认定是可以信赖的。applet他们之所以被认为是可信的是因为他们已经对上了特定的密匙,或者用户认为从特定来源来的是appliction可信的。在安全的方面上他们与应用()applet相同,但是其他方面(例如定位一个数据库)与则与相 似。 2
). 与java gui直接从出dbms发用客户/服务器模式来度曲服java务器不同,三层存取方式可能被使用。在这个场合里面,应rpc 用程序对中间层的服务发出调用,中间层的服务在网上,它又再去调用数据库。这些调用可能通过(remote procedure call)orb 或者(object request broker )mis。在这两种场合里面,中间层最好使用一个对象变化。我们希望三层结构会变得越来越普遍,因为对于管 理者来说,这可以使得他们有机会在公共数据库上显式地定义合法操作等。同时三层结构可以提供许多效率上的好处。 c
目前中间层一般用或c者+java +这样的语言来完成。通过优化编译器把把字java节代码翻译成为高效的机器代码,中间层也可以用来java实现。有 许多优良特性(健壮性,安全性,多线程)可以达到中间层需要达到的目的。
5.
安 全性考虑 java
作为网络上的语言必jdbc须十分注安全性的考虑。基于上面的讨论,的 两种主要使用场合里面,我们必须考虑安全性问题: *
在java applications的java场合里面代trusted码是本地的,所以也是"" *
没java applet有验证的代 码不可以存取本地的以及其他网络的数据。 5. 1. jdbc
和applet 未验证的 jdbc
首java先必须符合的 一般安全规则。另外: * jdbc
必applets须认为没有验证的是 不可靠的。 * jdbc
不applets可以让不可靠的存 取本地数据库。 *
一jdbc drivermanager个已经向注jdbc driver册的是只 能存取它所来的数据源。 *
一applet个也download只能向它所来 的服务器来存取数据。 jdbc
如果驱applet动层如果完全确信对一个数据库服务器打开连接不会引起认证或者权限问题(可能由网上随机主机上运行的程序引起),那么它就允许打ip开这样的连接。数据库服务器不通过地applet址来限制存取是相当少的,主要是为了举例。(当心,这一段话我可能翻译反了!!!大家看看原文。)这些限制是相当烦琐的。不过他们与对一般的 限制是一致的我们没有必要放开这些限制。 5. 2. jdbc
和java应 用程序 java
对于一个普通的应java用程序(例如全部用代applet 码而不是不可靠的)jdbc将 从本地的类路径里面获得驱动,并且允许应用程序自由存取文件,远程服务器等等。 applet
但是和一sun.sql.driver样,如果由于某些原因一个没有验证的类 从远程的来源里面获得,那么这个驱动只能和相同地方来的代码配合。 5. 3. driver
的 安全责任 jdbc driver
可applet能在各种情况下使用,所以驱动的编制者遵循一定的简单的安全规则,从而避免做 非法的数据库连接。 applet
如果所有的驱动都象一java样从网上下载,那么这些原则将是不必要的,因为普通的安全规则已经对它做了限制。但是驱动的编写者必须记住一旦他们的驱动获得成功,用户将在本地磁盘安装这些驱动,那么驱动将成为环applet境中一个被信任的部分,所以必须确信它不会被来访的所 滥用。所以我们鼓励所有的驱动编写者必须遵循一定安全原则。
所有这些原则都是在连接打开的时候使用。这正式驱动和虚拟机器检查当前调用者是否真的可以与指定的数据库连接的时刻。一旦连接建立就不必做更多的检查了。 5. 3. 1.
分tcp享/ip连 接的时候必须谨慎 jdbc 如果一个驱 tcp 动试图打开一个连java 接,那么这个打开会被安applet全管理机制自动检查。这个机构会检查当前调用栈里面有没有,jdbc如果有那么就限定它可以访问的机器集合。所以一般地驱tcp动可以把建java立检查留给虚 拟机。 jdbc
但是如果一个驱tcp动试图在多个数据库连接之间共享一个连applet a接,那么驱动就必须自己负责检查每个调用者是否真的被允许与目标数据库联系。例如如果我们为打foobah 开了一个通往机器的tcp连applet b接,这并不意味着被applet b自动允许来共享这个连接。可foobah能没有任何访问机器的tcp权力。所以在允许某个程序重用一个现成的连jdbc 接之前,驱 动必须通过安全机构来检查当前的的调用者是否可以访问这个连接。通过下面的代码可是实现这个功能。 securitymanager security
= system.getsecuritymanager( ); if
(security ! null=)
{ security.checkconnect
(hostname, portnumber) ;
} security.checkconnect
如果连接是不允许的,那么方java.lang.securityexception法将产生一个。 5. 3. 2. 检 查所有的本地文件访问 jdbc
如果一个取 得需要访问本地机器上的数据,那么他必须确信调用者是被允许打开这个文件的。例如: securitymanager security
= system.getsecuritymanager( ); if
(security ! null=)
{ security.checkread
(filename) ;
} security.checkread
如果对特定文件的访问是不允许的,那么方java.lang.securityexception法将产生一个。 5. 3. 3.
作 好最坏的准备
一些驱动可能使用本地的方法来桥接底层数据库程序。则这些情况里面判断那些本地文件将被底层函数所访问是困难的。 applet
在这些环境里面用户必须作好最坏的打算,并且否决所有下载所 发出的数据库存取,除非驱动可能完全确信将要做存取是没有问题的。 jdbc-odbc
例如一个桥odbc接器必须检查数applet据源的的名称,确保只 可以访问它的"生源地"。如果对有的名字中不能判断出数据源的主机名,那么只能否决这个访问。 applet
为了决定一个当前的调用者是可以信赖的应用还是一个,jdbc驱 动必须能够检查这个调用者是否可以写一个随机的文件: securitymanager security
= system.getsecuritymanager( ); if
(security ! null=)
{ security.checkwrite
(foobaz"" ); i.
}
