JDBC和JDBC驱动
首先要搞清楚的是,JDBC和JDBC驱动。JDBC指的是一组API,用于加载相应的驱动程序,说白了,在Java中,就是指的java.sql(Core API)和javax.sql(Extension API)两个包的内容。而JDBC驱动则是对应各数据库产品的驱动程序。与DB直接通话的,是JDBC驱动。一个常见的JDBC访问结构如下:
在应用程序与驱动之间多了一层JDBC,是为了屏蔽异种数据库的差异。
Quote: Java application calls the JDBC library. JDBC loads a driver which talks to the database. We can change database engines without changing database code.
四种JDBC驱动
JDBC驱动(不是JDBC)分为4类(Type or Level),分别是:
Type 1 – JDBC-ODBC桥驱动,也称Bridge
Type 2 – 本地API / 部分JAVA驱动,也称Native
Type 3 – All Java / Net-Protocol 驱动,也称Middleware
Type 4 – All Java / Native-Protocal驱动,也称Pure
参见:http://www.jdbc-tutorial.com/jdbc-driver-types.htm
Type 1 driver,Bridge驱动将所有JDBC请求翻译成ODBC请求,并转发给ODBC驱动。只建议在实验中使用,或没有其它选择时使用。
Type 2 driver,Native驱动,它将JDBC请求翻译为“特定的数据库请求”,
Type 3 driver,Middleware驱动将JDBC请求,通过网络,转发给中间层服务器。中间层再将其翻译为具体的数据库请求,中间层可以依次使用Type 1、2和4型驱动。
Type 4 driver,Pure驱动,使用java的network相关的库,直接与数据库服务器通信。
四种驱动的结构如下图:
四种驱动优缺点比较
四种JDBC驱动的优缺点比较如下:
JDBC驱动Type | 优点 | 缺点 |
Bridge | 1.只要DB的ODBC可用,这种方式可用于几乎所有数据库 | 1. 不是全由Java实现,移植性不好; 2. 所有Type中最慢的; 3. 客户端要先安装ODBC; 4. 不适用于WEB应用; |
Native | 1. 使用Native API,速度比Bridge快; | 1. 客户端要先安装Native API,故不适用于WEB系统; 2. 不是由Java实现,移植性不好; 3. 若更换数据库,则需安装相应的本地API; 4. 快要淘汰了; 5. 不是线程安全的; |
Middleware | 1. 基于服务端的,客户端不要安装什么东西; 2. 全由Java实现,易于移植,适于WEB应用; 3. 在可移植、扩展性、性能方面还有很大优化空间; 4. 适当设计网络协议,可使JDBC驱动很小,加载很快; 5. 提供了如缓存、负载均衡等高级特性,及logging和auditing 6. 一个驱动可用于多种数据库; 7. 在所有Type中,效率最高; | 1. 它需要额外的一个服务端系统(安装和维护的开销),回传结果集需要更长的时间; |
Pure | 1. 全由Java实现,平台无关,最适于WEB应用; 2. 架构层次减少,性能很不错; 3. 在客户端服务端都不需要额外安装软件,这些驱动支持动态下载; | 1. 每一种数据库都需要一个不同的驱动 |
JDBC的历史与版本
发布年份 | JDBC版本 | JSR规范 | JDK实现的版本 |
2006 | JDBC 4.0 | JSR 221 | JDK 6 |
2001 | JDBC 3.0 | JSR 54 | JDK 1.4 |
1999 | JDBC 2.1 |
| JDK 1.2 |
1997 | JDBC 1.2 |
| JDK 1.1 |
JDBC 4.0的新增特性:
1)自动载入java.sql.Driver
2)支持ROWID类型
3)支持国家字符集转换
4)支持SQL/XML与XML
虽然在JDK6中已经支持了JDBC 4.0,但是各数据库产品相应的JDBC驱动却未必有。当然,JDBC4.0是后向兼容的,借助JDK6使用JDBC3.0的功能是完全没有问题的。
提一下JDBC中的ResultSet和Cursor
一次查询的结果集就是ResultSet,包含0到多个Row。而Cursor游标被看作是指向一行记录的一个指针。JDBC API支持游标的forward、backward、移到特定行、移动到a row whose position is relative to another row,
ResultSet有三种Types:
TYPE_FORWARD_ONLY 不支持Scrollable,游标只能forward
TYPE_SCROLL_INSENSITIVE 支持Scrollable,游标既可forward也可backward,可以移动到某相对位置,也可移动到某绝对位置。对数据的改变不敏感,即当数据库变化时,当前结果集不变。
TYPE_SCROLL_SENSITIVE 支持Scrollable,游标既可forward也可backward,可以移动到某相对位置,也可移动到某绝对位置。对数据的改变敏感,即当数据库变化时,当前结果集也同步改变。
ResultSet有两种Concurrency:
CONCUR_READ_ONLY 不能用结果集更新数据库中的表。
CONCUR_UPDATETABLE 能用结果集更新数据库中的表。
如下代码示例:
Statement stmt = con.createStatement(a, b);
ResultSet srs = stmt.executeQuery(".....");
参数a和b分别为Type和Concurrency,若此处不指定参数,它们的默认值为TYPE_FORWARD_ONLY 和CONCUR_READ_ONLY。
另外,ResultSet接口提供了一系列方法以移动游标,如:next(), previous(), first(), last(), beforeFirst(), afterLast(), relative(int), absolute(int)等等。