目录 | 上一页 | 下一页 JDBCTM 指南:入门


10 其它新功能

本章描述了 JDBC 2.0 API 中的其它变化。

10.1 java.sql.ResultSet 的变化

ResultSet.getBigDecimal() 方法的新增版本可以返回全精度数值。

10.2 java.sql.ResultSetMetaData 的变化

ResultSetMetaData.getColumnType() 方法现在可以返回新的 SQL 类型代码: STRUCTDISTINCTBLOB 等。它通常返回 STRUCTDISTINCT 类型代码来代表结构化数值和 distinct 数值,而不管使用的是缺省还是自定义类型映射方式。

ResultSetMetaData.getColumnTypeName() 方法应该为新 SQL 类型的以下值。

列类型     列类型名
JAVA_OBJECT Java 类型的 SQL 名称
DISTINCT distinct 类型的 SQL 名称
STRUCT 结构化类型的 SQL 名称
ARRAY 与数据源相关的类型名称
BLOB 与数据源相关的类型名称
CLOB 与数据源相关的类型名称
REF 与数据源相关的类型名称

我们新增了 ResultSetMetaData.getColumnClassName() 方法,用于返回 Java 类的全限定名(如果调用 ResultSet.getObject() 方法来检索列中的数值,则生成该 Java 类的实例)。详细信息,参见单独的 API 文档。

当类型代码为 STRUCT、DISTINCT 或 JAVA_OBJECT 时,ResultSetMetaData.getColumnTypeName() 方法返回 SQL 类型全限定名。

10.3 DatabaseMetaData 的变化

DatabaseMetaData.getColumns() 方法现在可以返回以下的新 SQL3 类型的 DATA_TYPE 值: BLOB、CLOB 等等。DatabaseMetaData.getColumns() 方法所返回的类型名称与第 10.2 节中所列出的 SQL3 数据类型的类型名称一样。

新增了方法 DatabasemetaData.getConnection(),用于返回生成元数据对象的 Connection 对象。

新增了方法 DatabasemetaData.getUDTs()。详细信息,参见单独的 API 文档。

新增了支持新的 ResultSet 和批处理更新功能的方法: supportsResultSetConcurrency() supportsBatchUpdates() 等。详细信息,参见单独的 API 文档。

10.4 java.sql.DriverManager 的变化

新增了 DriverManager.setLogWriter() 方法,该方法将 java.io.PrintWriter 对象作为输入参数。新增的 DriverManager.getLogWriter() 方法返回 PrintWriter 对象。不鼓励使用 set/getLogStream() 方法。

10.5 日期、时间和时间戳

JDBC API 沿循了 Java 平台的日期和时间表示方法,即以相对于格林尼治标准时间 1970 年 1 月 1 日 00:00:00 的毫秒值来表示日期和时间。因为大多数数据库不支持时区的概念,所以 JDBC 2.0 API 新增了几种方法,允许 JDBC 驱动程序利用 Calendar 获得/设置某一特定时区的 DateTime 以及 Timestamp 值。例如,

ResultSet rs;
...
Date date1 = rs.getDate(1);

返回 Date 对象,该对象所含的毫秒值表示特定日期(如 1999 年 1 月3 日)及缺省时区中的标准时间 00:00:00。在缺省时区中,Date 的时间部分被设置为零,这是因为 SQL DATE 值没有时间部分。由于没有为 getDate() 显式地提供 Calendar,所以 JDBC 驱动程序在内部利用缺省时区(实际上是缺省 Calendar)来创建正确的毫秒值(假设基本数据库没有存储时区信息)。

下例检索 GMT(格林尼治标准时间)日期值。

ResultSet rs;
...

TimeZone.setDefault(TimeZone.getTimeZone("GMT"));
Calendar cal = Calendar.getInstance();
Date date2 = rs.getDate(1, cal);

上例中,Calendar 将被显式地传给 getDate(),以告知 JDBC 驱动程序如何计算正确的毫秒值。请注意:因为 JDBC 驱动程序在缺省情况下会采用缺省时区,所以只需更改一下缺省时区(不必显式地传递 Calendar)即可获得同样的结果。

请注意:如果假设缺省时区不是 GMT,则以上所创建的两个 Date 对象并不等同,即使它们表示的是“同一”日期。

if (date1.equals(date2))
	// 不可能执行到此

这是因为每种 Java 语言的 Date 对象实际上只是包含了标准化的毫秒时间值,而这些毫秒值在时区之间是不同的。如果应用程序要比较不同时区中的日期,则首先应该将日期转换到 Calendar

应用程序应该利用 Calendar 来创建 Date 对象。应用程序在使用 Calendar 时,应该负责将所需日期中的时间指定为 00:00:00(因为 JDBC 采用了这种约定)。另外,应用程序在创建 Time 值时,必须将日期 January 1, 1970 指定给为 Time 创建毫秒值的 Calendar,因为这是 JDBC 对时间的约定。



目录 | 上一页 | 下一页


jdbc@eng.sun.comjdbc-business@eng.sun.com

版权所有 © 1996, 1997 Sun Microsystems, Inc. 保留所有权利