目录 | 上一页 | 下一页 | JDBCTM 指南:入门 |
本章描述了 JDBC 2.0 API 中的其它变化。
ResultSet.getBigDecimal()
方法的新增版本可以返回全精度数值。
ResultSetMetaData.getColumnType()
方法现在可以返回新的 SQL
类型代码: STRUCT
、DISTINCT
、BLOB
等。它通常返回 STRUCT
和 DISTINCT
类型代码来代表结构化数值和 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 类型全限定名。
DatabaseMetaData.getColumns()
方法现在可以返回以下的新 SQL3
类型的 DATA_TYPE 值: BLOB、CLOB 等等。DatabaseMetaData.getColumns()
方法所返回的类型名称与第
10.2 节中所列出的 SQL3
数据类型的类型名称一样。
新增了方法 DatabasemetaData.getConnection()
,用于返回生成元数据对象的
Connection
对象。
新增了方法 DatabasemetaData.getUDTs()
。详细信息,参见单独的
API 文档。
新增了支持新的 ResultSet
和批处理更新功能的方法:
supportsResultSetConcurrency()
、 supportsBatchUpdates()
等。详细信息,参见单独的 API 文档。
新增了 DriverManager.setLogWriter()
方法,该方法将 java.io.PrintWriter
对象作为输入参数。新增的 DriverManager.getLogWriter()
方法返回 PrintWriter
对象。不鼓励使用 set/getLogStream()
方法。
JDBC API 沿循了 Java
平台的日期和时间表示方法,即以相对于格林尼治标准时间 1970 年 1
月 1 日 00:00:00
的毫秒值来表示日期和时间。因为大多数数据库不支持时区的概念,所以
JDBC 2.0 API 新增了几种方法,允许 JDBC 驱动程序利用 Calendar
获得/设置某一特定时区的 Date
、Time
以及 Timestamp
值。例如,
ResultSet rs; ... Date date1 = rs.getDate(1);
返回 Date
对象,该对象所含的毫秒值表示特定日期(如
1999 年 1 月3 日)及缺省时区中的标准时间 00:00:00。在缺省时区中,Date
的时间部分被设置为零,这是因为 SQL DATE
值没有时间部分。由于没有为 getDate()
显式地提供 Calendar
,所以
JDBC 驱动程序在内部利用缺省时区(实际上是缺省 Calendar
)来创建正确的毫秒值(假设基本数据库没有存储时区信息)。
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 对时间的约定。
目录
| 上一页 | 下一页版权所有 © 1996, 1997 Sun Microsystems, Inc. 保留所有权利
。