简介
JDBC(Java Database Connectivity, Java 数 据 库 连 接)是 一 种可用于执行 SQL 语句的 Java API(Application Programming Interface, 应用程序设计接口)。它由一些 Java 语言编写的类和接口组成。JDBC 为数据库应用开发人员、数据库前台开发人员提供了一种标准的应用程序设计接口, 使开发人员可以用纯 Java 语言编写完整的数据库应用程序。JDBC 通过调用其接口提供的方法, 提供了 Java 应用程序与各种数据库服务器之间的连接服务, 它支持 ANSI SQL- 92 标准, 实现了从 Java 程序内调用标准的 SQL 命令对数据库进行查询、插入、删除和更新等操作, 并确保数据事务的正常进行。JDBC API 主要用来连接数据库并通过 SQL 语句操作数据库。它可以执行一般的 SQL 语句、动态 SQL 语句及带 IN 和 OUT参数的存储过程。通过使用 JDBC 简化了开发数据库应用的复杂度, 加快了开发速度。开发人员可以很方便地将 SQL 语句传送给几乎任何一种数据库。而且 JDBC 支持所有的操作系统, 使得 Java 应用程序不再需要为每个应用程序编写额外的驱动。2.JDBC 的体系结构JDBC 是实现 Java 应用程序与各种不同数据库对话的一种机制。JDBC 由两部分与数据库独立的 API 组成, 一部分是面向程序开发人员的 JDBC API, 另一部分是面向底层的 JDBC Driv-er API。JDBC 提供了一个通用的 JDBC Driver Manger, 用来管理各种数据库软件商提供的 JDBC 驱动程序, 从而访问其数据库。此外, 对没有提供相应 JDBC 驱动程序的数据库系统, 开发了特殊的驱动程序: JDBC- ODBC 桥, 该驱动程序支持 JDBC 通过现有的 ODBC 驱动程序访问其数据库系统。JDBC 的基本层次结构由 Java 程序、JDBC 驱动程序管理器、驱动程序和数据库四部分组成1 。
JDBC驱动程序根据访问数据库的技术不同, JDBC 驱动程序相应地分为四种类型。不同类型的驱动程序有着不一样的特性和使用方法。
分类JDBC-ODBC桥驱动程序(JDBC-ODBC Bridge Driver)
此类驱动程序由JDBC-ODBC桥和一个ODBC驱动程序组成。其工作原理是,通过一段本地C代码将JDBC调用转化成ODBC调用。这一类型必须在本地计算机上先安装好ODBC驱动程序,然后通过JDBC-ODBCBridge的转换,将Java程序中使用的JDBCAPI访问指令转化成ODBCAPI指令,进而通过ODBC驱动程序调用本地数据库驱动代码完成对数据库的访问。
部分Java的本地JDBCAPI驱动程序
JDBC API驱动程序(Anative API partly Java technology-enabled Driver)此类驱动程序也必须在本地计算机上先安装好特定的驱动程序(类似ODBC),然后通过PartialJavaJDBCDriver的转换,把Java程序中使用的JDBC API转换成NativeAPI,进而存取数据库。
纯Java的数据库中间件驱动程序
纯Java的数据库中间件驱动程序(Pure Java Driver for Database Middleware)使用这类驱动程序时,不需要在本地计算机上安装任何附加软件,但是必须在安装数据库管理系统的服务器端加装中间件(Middleware),这个中间件负责所有存取数据库时必要的转换。其工作原理是:驱动程序将JDBC访问转换成与数据库无关的标准网络协议(通常是HTTP或HTTPS)送出,然后再由中间件服务器将其转换成数据库专用的访问指令,完成对数据库的操作。中间件服务器能支持对多种数据库的访问。
纯Java的JDBC驱动程序
纯Java的JDBC驱动程序(Direct-to-DatabasePureJavaDriver)这类驱动程序是直接面向数据库的纯Java驱动程序,即所谓的"瘦"驱动程序。使用这类驱动程序时无需安装任何附加的软件(无论是本地计算机或是数据库服务器端),所有存取数据库的操作都直接由JDBC驱动程序来完成,此类驱动程序能将JDBC调用转换成DBMS专用的网络协议,能够自动识别网络协议下的特殊数据库并能直接创建数据连接。
JDBC驱动程序的选择在企业内部信息系统中,选择合适的JDBC驱动程序,使之符合数据库程序设计的要求,是提高系统性能必须考虑的一个方面。开发者选择一种驱动时,需要权衡速度、可靠性和可移植性。不同的应用有不同的需要,一个独立的图形程序总要运行在Windows系统下,使用第二类驱动能够提高速度;一个Applet使用第三类驱动,可能是要穿过防火墙;一个Servlet要适应不同的操作系统,则需要使用第四类驱动。
这四类驱动程序中,第一类最节省投资。由于利用了已有的ODBC驱动程序,开发人员不必做额外的开发工作。但是,这种方式的缺点是比较突出的:首先,这种方式由于需要首先把JD-BC操作翻译成对应的ODBC调用,然后这些调用又被传送给ODBC驱动程序,最后才执行数据库的相关操作,所以性能受到影响,执行效率比较低,不适合对大数据量存取的应用。其次,由于事先需要安装其他附加的软件(ODBC驱动),有损Java数据库程序的兼容性,不具备跨平台性,不适合基于Internet/Intranet的应用。再次,这类驱动程序不支持完整的Java命令集,而只局限于ODBC驱动程序的功能。由于以上的缺点,桥接驱动程序用于已经在ODBC技术上投资的情形,例如已经投资了Windows应用服务器。Sun建议第一类驱动程序只用于原型开发,而不要用于正式的运行环境。
第二种方式具有开放性,其利用多层结构,上层用Java实现,支持多数据库,下层为本地代码(包括一些二进制代码和一个轻量的Java库),加快了执行速度,提高了数据库访问效率。然而,这种方式也有许多缺点:首先,第二类驱动程序也必须事先安装其他附加的软件(网络库),没有使用纯Java的API,很多时候,在体系结构上不能与大型主机的数据源兼容,即使做到了兼容,效果也是不尽人意。其次,本地化的代码增加了应用程序的危险性:如果在本地代码中存在缺陷,将可能使Java虚拟机完全垮掉。再次,第二类驱动程序要求编写面向特定平台的代码,使用这些驱动程序的开发者必须及时跟进不同数据库厂商针对不同操作系统发行的各个驱动程序版本。最后,客户端装入的网络库,同样会影响驱动程序的性能。由于以上的缺点,使第二类驱动程序的使用受到了限制。
第三类驱动程序是由纯Java语言开发而成的,并且中间件也仅需要在服务器上安装,不再需要客户端的本机代码,这类驱动程序的体积最小,效率较高,具有最大的灵活性。而且,此类驱动采用标准的网络协议,可以被防火墙支持,是开发Applet程序理想的选择(其实这些驱动是为Applet特别编写的),是Internet应用理想的解决方案。另外,开发者还可以利用单一的驱动程序连接到多种数据库。由于此种JDBC驱动程序提供了许多企业级的特征,因而非常适合用户的特殊用途,如:SSL安全、分布式事务处理等。如果用户未来扩张应用需要多个数据库,则选择这种方式是最理想的。由于它具有较好的性能和安全性,广泛应用于基于Web的应用系统的开发。其不足之处是:需要在服务器端安装中间件,这适当影响了驱动程序的效率。
第四类驱动程序可能是最佳的JDBC驱动程序类型。这是一类新型的驱动程序,它由数据库厂商提供,能够实现对于本公司数据库系统的最优化访问。它无需安装任何附加软件,不会增加任何额外开销,并且由纯Java语言开发而成,允许从客户机到数据库服务器的直接调用,能够自动识别网络协议下的特殊数据库并能直接创建数据连接,因此这种驱动程序的效率最高,拥有最佳的兼容性。然而,这种驱动也有它的不足:首先,由于使用DBMS专用的网络协议,可能不被防火墙支持,在Internet中会存在潜在安全隐患,成为这类驱动最大的缺陷。其次,不同DBMS的驱动程序不同,在一个异构计算环境中,驱动程序的数量可能会比较多。虽然有以上缺点,但是瑕不掩玉,此类驱动程序的诸多优点使得它的缺点并不突出,在企业级应用软件中,是应优先考虑的。因此,一个Servlet程序,要适应不同的操作系统,最好使用此类驱动;这种驱动也非常适合Applet程序,事实证明它能安全通过TCP/IP协议连接到数据库。
一般情况下,在开发Applet应用程序时,根据应用程序的具体要求和数据库系统的特点,选择第三类驱动程序或第四类驱动程序。
实例类型3 JDBC(java database connectivity)驱动程序
类型3 JDBC(java database connectivity)驱动程序是目前应用最为广泛的JDBC驱动程序,其实现技术被众多的驱动程序开发团体和个人所关注。目前,众多数据库厂商只是提供成型的产品,而没有公开它们的程序实现代码,因此仅凭成型的产品,要想知道类型3 JDBC驱动程序的实现过程非常困难2。
JDBC驱动程序由驱动类和数据库访问类组成。驱动类实现JDBC的Drive接口,具有自动注册功能。数据库访问类分别实现了JDBC规范中定义的数据库访问接口,在JDBC 1.2规范中主要包含有Connection(连接接口),Statement(语句接口)和ResultSet(结果集接口)三种接口。JDBC驱动程序工作过程可分为加载阶段、建立连接阶段和数据访问阶段。其中:加载阶段将驱动类实例注册到DriverManager(驱动程序管理器)中,为下一步建立数据库连接作准备。 Driver-Manager是一个JDBC驱动程序管理器,所有的驱动程序使用前都必须在其上登记注册,它提供对所有已注册驱动程序的管理。
建立连接阶段将建立数据库连接的请求发送给DriverManager, DriverManager将根据接收到的数据库URL地址(不同驱动程序定义的URL地址的格式不同)选择合适的数据库驱动程序,最终由驱动程序的驱动类实例创建数据库连接对象。数据访问阶段则进行真正的数据库操作,通过创建不同的Statement和ResultSet对象以及调用这些对象的方法来实现。类型3 JDBC驱动程序在遵守上述工作过程的同时又具有自身的特点,其系统结构见图。
从图可见,类型3 JDBC驱动程序为两层结构,它由驱动程序客户端程序和驱动程序服务器端程序组成。客户端直接与用户交互,它为用户提供符合JDBC规范的数据库统一编程接口,客户端将数据库请求通过特定的网络协议传送给服务器。服务器充当中间件的角色,它负责接收和处理用户的请求以及支持对多种数据库的操作。从图1还可知,类型3 JDBC驱动程序自身并不直接与数据库交互,而是借助于其他已实现的数据库驱动程序,成为“雇主”。可以想象,它“雇佣”的数据库驱动程序越多,则可支持的数据库就越多,“雇佣”的数据库驱动程序越强大,则类型3JDBC驱动程序的功能也越强大。除此之外,“雇佣”的数据库驱动程序的数量和成员可以动态改变,以满足系统扩展的需求。类型3 JDBC驱动程序的这一特性正是它强大的根源所在。