日期:2014-05-16 浏览次数:20538 次
概述 java 数据库连接 3.0 规范的新功能和改进之处?
josh heidebrecht(jheidebr@ca.ibm.com)
软件工程师,ibm
2001 年 7 月
java 数据库连接(java database connectivity,jdbc)api 是作为 java 2 标准版(java 2 standard edition,j2se)和 java 2 企业版(java 2 enterprise edition,j2ee)平台的一个关键部分出现的。他是一种主要的基于标准的机制,能让 java 语言通过编程来访问关系数据库,所以当 java community process 发布一份新版本的规范时,研发人员一定会感兴趣。在此,我们就 sun microsystems 最近发布的 jdbc 规范的提议最终草案(proposed final draft)3.0 版本来总结一下他的一些新的主要功能。加入讨论论坛,和作者和其他读者分享你对本文的看法。
介绍?
java 数据库连接(jdbc)3.0 规范建立在其原本稳固的基础上,增加了几个新功能以弥补原来功能不足的地方。无论是 java.sql 还是第一次出现的 javax.sql 软件包,都会包含在还处于测试阶段的 java 1.4 版平台中。在今年晚些时候他就会被正式发布,到时 java 研发人员就能够利用这些改进了,所以目前正是开始了解这些改动的好时候。
我们会简单地讨论一下 jdbc 的设计师们为这个版本所考虑到的几个设计目标。理解了设计师们的设计基本原理,我们就能更好地去理解那些改动。我们会总结一下规范中的几个新功能以便了解整个 api 是怎样被改动的。另外,我们还会深入研究几个最适用于应用程式研发人员的关键功能,以成功地协助你利用其新性能。?
设计目标?
设计 jdbc 3.0 规范的初衷主要是让原先的 jdbc 规范下的功能更加完美。因此,这个新规范的设计指导原则之一就是要和现存的应用程式和驱动程式保持兼容性。所以,jdbc 2 的用户能放心,他们的应用程式能在 jdbc 3.0 下正确运行。另外,使用以前那些遭反对的方法写进 jdbc 1 api 的代码也能继续运行。
随着 j2ee 平台迅速的日益流行,设计师们也想增强 jdbc 的可伸缩性。新增的语句池和增强的连接池支持离实现这个目标还非常远。此外,设计师们还仔细地考虑 jdbc 和新的连接器体系结构之间的关系,来继续提高服务器上的 java 技术。
在 jdbc 2 研发的过程中,sql99 还处在一种变化不定的情况下。目前规范已完成了,而且数据库厂商已采用了部分标准。所以自然地,jdbc 规范就跟着将自己和 sql99 功能的一部分相统一。最新的 jdbc 规范已采用了 sql99 标准中那些已被广泛支持的功能,更有那些在五年内可能会获得支持的功能。?
如果一个数据库还不支持 jdbc 3.0 所支持的部分 sql99 功能,驱动程式能使用元数据 api 向应用程式研发人员表明:其底层数据库不支持一部分 jdbc 功能。这一点允许数据库厂商生产出相应的 jdbc 驱动程式,尽管他们可能不支持所有的功能。增加的两种新的数据类型及对事务的 savepoint 的支持说明了两个和 sql99 有关的改动。
新功能摘要?
元数据 api?
元数据 api 已得到更新,databasemetadata 接口目前能检索 sql 类型的层次结构,一种新的 parametermetadata 接口能描述 preparedstatement 对象中参数的类型和属性。
callablestatements 中已命名的参数?
在 jdbc 3.0 之前,设置一个存储过程中的一个参数要指定他的索引值,而不是他的名称。callablestatement 接口已被更新了,目前你能用名称来指定参数。
数据类型的改动?
jdbc 所支持的数据类型作了几个改动,其中之一是增加了两种新的数据类型。
为了便于修改 clob(character large object,字符型巨对象)、blob(binary large object,二进制巨对象)和 ref(sql 结构)类型的值,同名的数据类型接口都被更新了。接下来的是,因为我们目前能够更新这些数据类型的值,所以 resultset 接口也被修改了,以支持对这些数据类型的列的更新,也包括对 array 类型的更新。?
增加的两种新的数据类型是 java.sql.types.datalink 和 java.sql.types.boolean。新增的数据类型指的是同名的 sql 类型。datalink 提供对外部资源的访问或 url,而 boolean 类型在逻辑上和 bit 类型是等同的,只是增加了在语义上的含义。datalink 列值是通过使用新的 geturl() 方法从 resultset 的一个实例中检索到的,而 boolean 类型是通过使用 getboolean() 来检索的。
检索自动产生的关键字?
为了解决对获取自动产生的或自动增加的关键字的值的需求,jdbc 3.0 api 目前将获取这种值变得非常轻松。要确定所有所产生的关键字的值,只要简单地在语句的 execute() 方法中指定一个可选的标记,表示你有兴趣获取产生的值。你感兴趣的程度能是 statement.return_generated_keys,也能是 statement.no_generated_keys。在执行这条语句后,所产生的关键字的值就会通过从 statement 的实例方法 getgeneratedkeys() 来检索 resultset 而获得。resultset 包含了每个所产生的关键字的列。清单 1 中的示例创建一个新的作者并返回对应的自动产生的关键字。?
清单 1. 检索自动产生的关键字
statement stmt = conn.createstatement();
// obtain the generated key that results from the query.
stmt.executeupdate("insert into authors " +
???????????"(first_name, last_name) " +
???????????"values (george, orwell)",
???????????statement.return_generated_keys);
resultset rs = stmt.getgeneratedkeys();
if ( rs.next() ) {
????// retrieve the auto generated key(s).
????int key = rs.getint();}
连接器关系?
大多数应用程式研发人员不必知道 jdbc 和 j2ee 连结器体系结构之间的关系,就能非常好地使用 jdbc api。不过,由于 jdbc 3.0 规范已考虑到这项新的体系结构,这使得研发人员能更好地理解 jdbc 在哪里适合 j2ee 标准,及这个规范的发展方向是什么。?
j2ee 连结器体系结构指定了一组协议,允许企业的信息系统以一种可插入的方式连接到应用服务器上。这种体系结构定义了负责和外部系统连接的资源适配器。连接器服务提供者接口(the connectors service provider interface,spi)恰好和 jdbc 接口提供的服务紧密配合。
jdbc api 实现了连结器体系结构定义的三个协议中的两个。第一个是将应用程式组件和后端系统相连接的连接管理,他是由 datasource 和 connectionpooldatasource 接口来实现的。第二个是支持对资源的事务性访问的事务管理,他是由 xadatasource 来处理的。第三个是支持后端系统的安全访问的安全性管理,在这点上,jdbc 规范并没有所有对应点。尽管有最后那个不足,jdbc 接口仍能映射到连接器