09_database_02_jdbc-1

第七十七章 JDBC(Java Database Connectivity)

1. 简介

JDBC(Java Database Connectivity)为Java程序提供了统一的数据访问接口。使用JDBC,Java程序能够访问关系型数据库(Relational Database),电子数据表(Spreadsheet),或者存放在文件中的数据。JDBC的功能包含在java.sql和javax.sql包中。

在大多数情况下,Java应用程序使用JDBC接口来访问关系型数据库。下图展示的是JDBC应用场景的结构图。Java应用程序可以通过使用JDBC接口来访问各种关系型数据库(例如:PostgreSQL, MySQL, Oracle等)。在JDBC接口之下,会根据连接的数据库分别使用对应的JDBC驱动程序(JDBC Driver)。如果Java应用程序连接的是PostgreSQL数据库,那么,Java应用程序需要通过使用JDBC-PostgreSQL驱动程序与数据库建立连接。如果Java应用程序连接的是MySQL数据库,那么,Java应用程序需要使用JDBC-MySQL驱动程序与数据库建立连接。以此类推。

图一 JDBC结构图

图一 JDBC结构图

因此,我们计划在本章中详细介绍JDBC驱动的原理与几种实现方法。在后续的章节内容中会逐步介绍JDBC的使用方法。

2. JDBC驱动(JDBC Driver)简介

在介绍JDBC驱动的原理之前,我们首先需要明确两个概念JDBCODBC

ODBC(Open Database Connectivity)是一个标准的、访问数据库系统的程序设计接口(API)。ODBC的一个重要的设计目标是使用ODBC接口的应用程序独立于数据库的种类和运行的操作系统环境。简而言之,当需要切换数据库或者操作系统环境时,应用程序不需要修改任何代码就能运行在新的数据库环境中。ODBC接口是面向所有编程语言的,不仅Java语言能使用ODBC接口,C++、Python等通用语言都能够使用ODBC接口。使用ODBC接口的应用程序需要通过ODBC驱动(ODBC Driver)与数据库交互。大部分ODBC驱动是由C/C++语言实现的。

JDBC是一个面向Java语言的、提供数据库访问的程序设计接口。JDBC接口的设计也是独立于数据库和操作系统环境的。因此,理论上,Java程序能够很轻松的移植到一个新的数据库环境上。使用JDBC接口的应用程序需要通过JDBC驱动(JDBC Driver)与数据库交互。只有Java应用程序才能使用JDBC接口;JDBC驱动的实现有多种方式,下一小节将详细介绍。

除了ODBC和JDBC接口以外,数据库服务器常常还会实现一套"本地接口"(Native API)。在各种数据库之中,“本地接口”的实现方式和使用方式各不相同。因此,"本地接口"不是一个通用性的数据库编程接口。提供“本地接口”的目的是为了向客户端提供一个访问数据的接口或者通道。有些数据库系统会在"本地接口"之上搭建ODBC接口或者JDBC接口。

3. JDBC驱动的实现方法

到目前为止,JDBC驱动有如下几种实现方法。它们常常被称为Type 1,Type 2,Type 3和Type 4 JDBC驱动程序的实现方式。Type 1 (JDBC-ODBC桥接法)是最早实现的一种方式。它的性能较低,移植性不好。随着技术的发展,JDBC驱动已发展到第四个版本(Type 4)。从目前的应用来看,第四版的性能和通用性最好。它被用于绝大多数Java数据库应用程序之中。JDBC驱动的第五个版本正在开发中,但是,目前尚未发布正式版本。

3.1 JDBC-ODBC桥接法(JDBC-ODBC Bridge)

实现JDBC驱动的第一种方法为JDBC-ODBC桥接法。使用JDBC-ODBC桥接法的驱动程序一面使用了ODBC接口,接通了数据库;另一面则向Java应用程序提供了JDBC数据库访问接口。当Java程序调用JDBC接口,访问数据库时,该驱动程序会将JDBC的请求转换为ODBC的请求,转发给数据库。当收到数据库的响应时,则将响应数据从ODBC的响应格式转化为JDBC的响应格式,返回给Java应用程序。

使用JDBC-ODBC桥接法实现JDBC驱动程序的好处是开发量较小,因为它可以直接使用ODBC驱动,与数据库交互。但是,这种方法的缺陷是性能较慢,因为该驱动需要进行JDBC-ODBC的转换。和直接使用ODBC驱动的程序相比,数据库交互的速度较慢。因为,JDBC-ODBC桥接法使用了ODBC接口,所以,它还需要使用ODBC驱动程序(ODBC Driver)。

因为诸多缺点,这种方法已逐渐退出历史舞台。

图二 JDBC-ODBC桥接法结构图

图二 JDBC-ODBC桥接法结构图

3.2 Native-API法

Native-API是指通过使用本地方法(Native Method)来实现JDBC接口。这里的本地方法往往是使用C/C++语言使用的,向客户端提供交互功能的接口。数据库提供的本地方法只能用于连接该数据库;本地方法不提供数据库通用接口。

因此,使用Native-API的JDBC驱动程序一面使用Native API方法与数据库建立连接,另一面向Java应用程序提供JDBC接口。相比较而言,使用Native-API比JDBC-ODBC桥接法速度更快,效率更高,因为使用Native-API的驱动程序直接将JDBC的请求转换成本地方法的请求。但是,因为并不是所有的数据库都会提供Native API,Native-API并不一定适用于所有数据库。

Oracle OCI(Oracle Call Interface)驱动是使用Native-API法实现JDBC驱动的一个例子。

图三 JDBC Native-API结构图

图三 JDBC Native-API结构图

3.3 网络协议驱动(Network-Protocol Driver)

网络协议驱动实际上扮演的是一个中间层的角色。该类型驱动程序可以全部由Java代码实现。从结构上看,该类型驱动将JDBC的请求和响应转化成为数据库特有的协议(Convert JDBC calls directly or indirectly into a vendor-specific database protocol)。

从下面的结构图上可以看出,Java应用程序不再需要使用任何具体的数据库驱动程序,而只需要一个中间层的驱动。但是,在中间层上,它还是需要使用具体数据库的驱动程序与其建立连接。

图四 JDBC Network Protocol法结构图

图四 JDBC Network Protocol法结构图

3.4 直接使用数据库协议(Database Protocol Driver)

目前流行的数据库都会设计和实现一套客户端-服务器端的通信协议(Client-Server Communication Protocol)。那么,JDBC驱动程序也可以使用这个协议与数据库建立连接。因此,这成为了第四种JDBC驱动的实现方法。

在这种方法下,因为数据库通信协议是与编程语言无关的。因此,该类的驱动程序可以全部使用Java语言实现,也可以使用其他语言来实现。

这种方法的优势是性能好,驱动程序直接将JDBC接口的数据转化为协议上使用的数据,直接发送给数据库。但是,因为协议是依赖于数据库的具体实现的。因此,当更换数据库时,Java应用程序需要更换驱动程序。

图五 JDBC Native Protocol法结构图

图五 JDBC Native Protocol法结构图

4. 小结

本章介绍了JDBC的工作流程和JDBC驱动的原理和实现方法。我们将在接下来的章节中逐步介绍JDBC接口和使用方法。

本系列文章的主题如下:

 

上一章
下一章

注册用户登陆后可留言

Copyright  2019 Little Waterdrop, LLC. All Rights Reserved.