快速业务通道

关于Java Database Connectivity您不知道的5件事:提升您和JDBC API的关系 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23

关于Java Database Connectivity您不知道的5件事:提升您和JDBC API的关系

时间:2010-11-03 IBM Ted Neward

关于Java Database Connectivity您不知道的5件事:提升您和JDBC API的关系

目前,许多开发人员把 Java Database Connectivity (JDBC) API 当作一种数据访问平台,比如 Hibernate 或 SpringMany。然而 JDBC 在数据库连接中不仅仅充当后台角色。对于 JDBC,您了解的越多,您的 RDBMS 交互效率就越高。

在本期 5 件事 系列 中,我将向您介绍几种 JDBC 2.0 到 JDBC 4.0 中新引入的功能。设计时考虑到现代软件开发所面临的挑战,这些新特性支持应用程序可伸缩性,并提高开发人员的工作效率 — 这是现代 Java 开发人员面临的两个最常见的挑战。

1. 标量函数

不同的 RDBMS 实现对 SQL 和/或增值特性(目的是让程序员的工作更为简单)提供不规则的支持。例如,众所周知,SQL 支持一个标量运算 COUNT(),返回满足特定 SQL 过滤规则的行数(更确切地说,是 WHERE 谓词)。除此之外,修改 SQL 返回的值是很棘手的 — 想要从数据库获取当前日期和时间会使 JDBC 开发人员、甚至最有耐心的程序员发疯(甚至是心力憔悴)。

于是,JDBC 规范针对不同的 RDBMS 实现通过标量函数提供一定程度的隔离/改写。JDBC 规范包括一系列受支持的操作,JDBC 驱动程序应该根据特定数据库实现的需要进行识别和改写。因此,对于一个支持返回当前日期和/或时间的数据库,时间查询应当如清单 1 那样简单:

清单 1. 当前时间?

Connection conn = ...; // get it from someplace Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("{CURRENT_DATE()}");

JDBC API 识别的标量函数完整列表在 JDBC 规范附录中给出,但是给定的驱动程序或数据库可能不支持完整列表。您可以使用从 Connection 返回的 DatabaseMetaData 对象来获取给定 JDBC 支持的函数,如清单 2 所示:

清单 2. 能为我提供什么?

Connection conn = ...; // get it from someplace DatabaseMetaData dbmd = conn.getMetaData();

标量函数列表是从各种 DatabaseMetaData 方法返回的一个逗号分隔的 String。例如,所有数值标量由 getNumericFunctions() 调用列出,在结果上执行一个 String.split() — 瞧! — 即刻出现 equals()-testable 列表。

2. 可滚动 ResultSets

创建一个 Connection 对象,并用它来创建一个 Statement,这在 JDBC 中是最常用的。提供给 SQL SELECT 的 Statement 返回一个 ResultSet。然后,通过一个 while 循环(和 Iterator 没什么不同)得到 ResultSet,直到 ResultSet 为空,循环体从左到右的每次提取一列。

这整个操作过程是如此普遍,近乎神圣:它这样做只是因为它应该这样做。唉!实际上这是完全没必要的。

引入可滚动 ResultSet

许多开发人员没有意识到,在过去的几年中 JBDC 已经有了相当大的增强,尽管这些增强在新版本中已经有所反映。 第一次重大增强是在 JDBC 2.0 中,发生在使用 JDK 1.2 期间。写这篇文章时,JDBC 已经发展到了 JDBC 4.0。

JDBC 2.0 中一个有趣的增强(尽管常常被忽略)是 ResultSet 的滚动功能,这意味着您可以根据需要前进或者后退,或者两者均可。这样做需要一点前瞻性,然而 — JDBC 调用必须指出在创建 Statement 时需要一个可以滚动的 ResultSet。

关于Java Database Connectivity您不知道的5件事:提升您和JDBC API的关系(2)

时间:2010-11-03 IBM Ted Neward

验证 ResultSet 类型

如果您怀疑一个驱动程序事实上可能不支持可滚动的 ResultSets,不管 DatabaseMetaData 中是如何写的,您都要调用 getType() 来验证

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号