JDBC介绍
![](https://i-blog.csdnimg.cn/blog_migrate/1ca0a3de5350559d8948b613f3af6c89.png)
JDBC的体系结构
JDBC的结构可划分为两层:一个是面向底层的JDBC Driver Interface(驱动程序管理器接口)(各数据库厂商负责实现接口),另一个是面向程序员的JDBC API。
使用JDBC编程,可让开发人员从复杂的驱动器调用命令和函数中解脱出来,可以致力于应用程序中的关键地方。JDBC支持不同的关系数据库,这使得程序的可移植性大大加强。JDBC API是面向对象的,可以让用户把常用的方法封装为—个类,以备后用。但是它也有缺点,一是使用JDBC,访问数据记录的速度会受到一定程度的影响。二是JDBC结构中包含不同厂家的产品,这就给更改数据源带来了很大的麻烦。
JDBC核心接口与类
JDBC核心类库包含在java.sql包中。
接口:
- Connection:特定数据库的连接(会话)。在连接上下文中执行SQL语句并返回结果。
- PreparedStatement:表示预编译的 SQL 语句的对象。
- Statement:用于执行静态 SQL 语句并返回它所生成结果的对象。
- ResultSet :表示数据库结果集的数据表,通常通过执行查询数据库的语句生成 。
- CallableStatement :用于执行 SQL 存储过程的接口 。
类:
- DriverManager:负责管理JDBC驱动程序。使用JDBC驱动程序之前,必须先将驱动程序加载并注册后才可以使用,同时提供方法来建立与数据库的连接。(加载到内存中才能使用)
- SQLException:有关数据库操作的异常。
JDBC优缺点
优点:
JDBC使得编程人员从复杂的驱动器调用命令和函数中解脱出来,可以致力于应用程序中的关键地方。
JDBC支持不同的关系数据库,这使得程序的可移植性大大加强。
JDBC API是面向对象的,可以让用户把常用的方法封装为—个类,以备后用。
缺点:
使用JDBC,访问数据记录的速度会受到一定程度的影响。
JDBC结构中包含不同厂家的产品,这就给更改数据源带来了很大的麻烦。
数据库驱动程序
第一类: jdbc-odbc桥
把JDBC API调用转换成ODBC API 调用,然后ODBC API调用针对供应商的ODBC 驱动程序来访问数据库,即利用JDBC- ODBC 桥通过ODBC来存储数据源 。
第二类: 本地API驱动
本地api驱动直接把jdbc调用转变为数据库的标准调用再去访问数据库。这种方法需要本地数据库驱动代码。
第三类: 网络协议驱动
它使用一种与具体数据库无关的协议将数据库请求发送给一个中间服务器。
第四类: 本地协议驱动
这种驱动直接把jdbc调用转换为符合相关数据库系统规范的请求。由于4型驱动写的应用可以直接和数据库服务器通讯,这种类型的驱动完全由java实现,因此实现了平台独立性。 通常开发中多采用第四种方式,这种驱动不需要先把jdbc的调用传给odbc或本地数据库接口或者是中间层服务器,所以它的执行效率是非常高的驱动。
注:各数据库厂商均提供对 JDBC 的支持,即提供数据库连接使用的驱动程序文件需要为数据库应用程序正确加载驱动程序文件以获得数据库连接,实施操作。
创建JDBC应用程序的步骤
1. 载入JDBC驱动程序
2. 定义连接URL
3. 建立连接
4. 创建Statement对象
5. 执行查询或更新
6. 结果处理
7. 关闭连接
JDBC驱动程序
JDBC(java database connectivity)驱动程序是对JDBC规范完整的实现,它的存在在JAVA程序与数据库系统之间建立了一条通信的渠道。
简介
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 Driver API。JDBC 提供了一个通用的 JDBC Driver Manger, 用来管理各种数据库软件商提供的 JDBC 驱动程序, 从而访问其数据库。此外, 对没有提供相应 JDBC 驱动程序的数据库系统, 开发了特殊的驱动程序: JDBC- ODBC 桥, 该驱动程序支持 JDBC 通过现有的 ODBC 驱动程序访问其数据库系统。JDBC 的基本层次结构由 Java 程序、JDBC 驱动程序管理器、驱动程序和数据库四部分组成。
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驱动程序,开发人员不必做额外的开发工作。但是,这种方式的缺点是比较突出的:首先,这种方式由于需要首先把JDBC操作翻译成对应的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驱动程序的实现过程非常困难。
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驱动程序的这一特性正是它强大的根源所在。
各种数据库的jdbc驱动下载及连接方式
数据库名称 | 下载地址 | 说明 |
Mysql | MySQL :: MySQL Connectors | Shipped. But need to download the latest for MySQL 4.1 or higher. |
Oracle | jTDS - SQL Server and Sybase JDBC driver - Browse Files at SourceForge.net software/tech/java/sqlj_jdbc/index.html | Included. |
SQL Server by jTDS | jTDS - SQL Server and Sybase JDBC driver - Browse Files at SourceForge.net | Included. Support Microsoft SQL Server (6.5, 7, 2000 and 2005) |
Postgres | PostgreSQL JDBC Download | Included 7.3 JDBC 3 |
SAP DB | SAP MaxDB | SAP Community | Included. |
SyBase by jTDS | http://jtds.sourceforge.net/ | Included. Support Sybase (10, 11, 12) |
各种驱动的连接方法:
1. MySQL
(http://www.mysql.com) mysql-connector-java-2.0.14-bin.jar ;
Class.forName("org.gjt.mm.mysql.Driver");
cn = DriverManager.getConnection("jdbc:mysql://MyDbComputerNameOrIP:3306/myDatabaseName", sUsr, sPwd);
2. PostgreSQL
(http://www.de.postgresql.org) pgjdbc2.jar ;
Class.forName("org.postgresql.Driver");
cn = DriverManager.getConnection("jdbc:postgresql://MyDbComputerNameOrIP/myDatabaseName", sUsr, sPwd );
3. Oracle
(http://www.oracle.com/ip/deploy/database/oracle9i/) classes12.zip ;
Class.forName( "oracle.jdbc.driver.OracleDriver" );
cn = DriverManager.getConnection("jdbc:oracle:thin:MyDbComputerNameOrIP:1521:ORCL", sUsr, sPwd );
4. Sybase
(http://jtds.sourceforge.net) jconn2.jar ;
Class.forName("com.sybase.jdbc2.jdbc.SybDriver");
cn = DriverManager.getConnection("jdbc:sybase:Tds:MyDbComputerNameOrIP:2638", sUsr, sPwd);
//(Default-Username/Password: "dba"/"sql")
5. Microsoft SQLServer
(http://jtds.sourceforge.net) ;
Class.forName( "net.sourceforge.jtds.jdbc.Driver" );
cn = DriverManager.getConnection("jdbc:jtds:sqlserver://MyDbComputerNameOrIP:1433/master", sUsr, sPwd);
6. Microsoft SQLServer
(http://www.microsoft.com) ;
Class.forName( "com.microsoft.jdbc.sqlserver.SQLServerDriver" );
cn = DriverManager.getConnection("jdbc:microsoft:sqlserver://MyDbComputerNameOrIP:1433;databaseName=master", sUsr, sPwd );
7. ODBC
Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" );
Connection cn = DriverManager.getConnection( "jdbc:dbc:" + sDsn, sUsr, sPwd );
8.DB2
Class.forName("com.ibm.db2.jdbc.net.DB2Driver");
String url="jdbc:db2://192.9.200.108:6789/SAMPLE"
cn = DriverManager.getConnection( url, sUsr, sPwd );
9.access
由于access并不是作为一项服务运行,所以url的方法对他不适用。access可以通过odbc,也可以通过服务器映射路径的形式 找到.mdb文件,参见http://rmijdbc.objectweb.org/Access/access.html