📄 jdbc2.0.frame10.html
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<html>
<head>
<meta HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=gb2312">
<title></title>
</head>
<body bgcolor="#ffffff">
<table width="100%">
<tr>
<td><font size="-1"><a href="jdbc2.0.frame.html">目录</a> | <a
href="jdbc2.0.frame9.html">上一页</a> | <a href="jdbc2.0.frame11.html">下一页</a> </font></td>
<td align="right"><i>JDBC<sup><font size="-2">TM</font></sup> 指南:入门</i></td>
</tr>
</table>
<hr>
<p><br>
<a name="288813"></a> </p>
<h2>10 其它新功能</h2>
<p>本章描述了 JDBC 2.0 API 中的其它变化。</p>
<p><a name="284722"></a> </p>
<h3>10.1 java.sql.ResultSet 的变化</h3>
<code>
<p>ResultSet.getBigDecimal()</code> 方法的新增版本可以返回全精度数值。</p>
<p><a name="299317"></a> </p>
<h3>10.2 java.sql.ResultSetMetaData 的变化</h3>
<code>
<p>ResultSetMetaData.getColumnType()</code> 方法现在可以返回新的 SQL
类型代码: <code>STRUCT</code>、<code>DISTINCT</code>、<code>BLOB</code>
等。它通常返回 <code>STRUCT</code> 和 <code>DISTINCT</code>
类型代码来代表结构化数值和 distinct
数值,而不管使用的是缺省还是自定义类型映射方式。</p>
<p><a name="299321"></a><code>ResultSetMetaData.getColumnTypeName() </code>方法应该为新
SQL 类型的以下值。</p>
<p><a name="299322"></a> </p>
<table Border="0">
<tr>
<td>列类型 </td>
<td> 列类型名 </td>
</tr>
<tr>
<td>JAVA_OBJECT </td>
<td>Java 类型的 SQL 名称 </td>
</tr>
<tr>
<td>DISTINCT </td>
<td>distinct 类型的 SQL 名称 </td>
</tr>
<tr>
<td>STRUCT </td>
<td>结构化类型的 SQL 名称 </td>
</tr>
<tr>
<td>ARRAY </td>
<td>与数据源相关的类型名称 </td>
</tr>
<tr>
<td>BLOB </td>
<td>与数据源相关的类型名称 </td>
</tr>
<tr>
<td>CLOB </td>
<td>与数据源相关的类型名称 </td>
</tr>
<tr>
<td>REF </td>
<td>与数据源相关的类型名称 </td>
</tr>
</table>
<table>
<tr>
<td></td>
</tr>
</table>
<p><a name="299463"></a> </p>
<p><a name="299320"></a>我们新增了 <code>ResultSetMetaData</code>.<code>getColumnClassName()
</code>方法,用于返回 Java 类的全限定名(如果调用 ResultSet.getObject()
方法来检索列中的数值,则生成该 Java
类的实例)。详细信息,参见单独的 API 文档。</p>
<p>当类型代码为 STRUCT、DISTINCT 或 JAVA_OBJECT 时,<code>ResultSetMetaData.getColumnTypeName()</code>
方法返回 SQL 类型全限定名。</p>
<p><a name="299502"></a> </p>
<h3>10.3 DatabaseMetaData 的变化</h3>
<code>
<p>DatabaseMetaData.getColumns()</code> 方法现在可以返回以下的新 SQL3
类型的 DATA_TYPE 值: BLOB、CLOB 等等。<code>DatabaseMetaData.getColumns() </code>方法所返回的类型名称与第
<a href="jdbc2.0.frame10.html#299317">10.2</a> 节中所列出的 SQL3
数据类型的类型名称一样。</p>
<p>新增了方法 <code>DatabasemetaData.getConnection()</code>,用于返回生成元数据对象的
<code>Connection</code> 对象。</p>
<p><a name="299512"></a>新增了方法 <code>DatabasemetaData.getUDTs()</code>。详细信息,参见单独的
API 文档。</p>
<p><a name="299516"></a>新增了支持新的 <code>ResultSet </code>和批处理更新功能的方法:
<code>supportsResultSetConcurrency() </code>、 <code>supportsBatchUpdates()</code>
等。详细信息,参见单独的 API 文档。</p>
<p><a name="284725"></a> </p>
<h3>10.4 java.sql.DriverManager 的变化</h3>
<p>新增了 <code>DriverManager.setLogWriter()</code> 方法,该方法将 <code>java.io.PrintWriter</code>
对象作为输入参数。新增的 <code>DriverManager.getLogWriter()</code>
方法返回 <code>PrintWriter</code> 对象。不鼓励使用 <code>set/getLogStream()</code>
方法。</p>
<p><a name="301825"></a> </p>
<h3>10.5 日期、时间和时间戳</h3>
<p>JDBC API 沿循了 Java
平台的日期和时间表示方法,即以相对于格林尼治标准时间 1970 年 1
月 1 日 00:00:00
的毫秒值来表示日期和时间。因为大多数数据库不支持时区的概念,所以
JDBC 2.0 API 新增了几种方法,允许 JDBC 驱动程序利用 <code>Calendar</code>
获得/设置某一特定时区的 <code>Date</code>、<code>Time</code> 以及 <code>Timestamp</code>
值。例如, </p>
<p><a name="301730"></a> </p>
<blockquote>
<pre>ResultSet rs;
...
Date date1 = rs.getDate(1);
</pre>
</blockquote>
<p><a name="301732"></a></p>
<p>返回 <code>Date</code> 对象,该对象所含的毫秒值表示特定日期(如
1999 年 1 月3 日)及缺省时区中的标准时间 00:00:00。在缺省时区中,Date
的时间部分被设置为零,这是因为 SQL DATE
值没有时间部分。由于没有为 <code>getDate() </code>显式地提供 <code>Calendar</code>,所以
JDBC 驱动程序在内部利用缺省时区(实际上是缺省 <code>Calendar</code>)来创建正确的毫秒值(假设基本数据库没有存储时区信息)。</p>
<p><a name="301748"></a>下例检索 GMT(格林尼治标准时间)日期值。</p>
<p><a name="301778"></a> </p>
<blockquote>
<pre>ResultSet rs;
...
TimeZone.setDefault(TimeZone.getTimeZone("GMT"));
Calendar cal = Calendar.getInstance();
Date date2 = rs.getDate(1, cal);
</pre>
</blockquote>
<p><a name="301753"></a></p>
<p><a name="301798"></a>上例中,<code>Calendar</code> 将被显式地传给 <code>getDate()</code>,以告知
JDBC 驱动程序如何计算正确的毫秒值。请注意:因为 JDBC
驱动程序在缺省情况下会采用缺省时区,所以只需更改一下缺省时区(不必显式地传递
<code>Calendar</code>)即可获得同样的结果。</p>
<p><a name="301800"></a>请注意:如果假设缺省时区不是 GMT,则以上所创建的两个
<code>Date</code> 对象并不等同,即使它们表示的是“同一”日期。</p>
<p><a name="301801"></a> </p>
<blockquote>
<pre>if (date1.equals(date2))
// 不可能执行到此
</pre>
</blockquote>
<p><a name="301806"></a></p>
<p><a name="301809"></a>这是因为每种 Java 语言的 <code>Date</code>
对象实际上只是包含了标准化的毫秒时间值,而这些毫秒值在时区之间是不同的。如果应用程序要比较不同时区中的日期,则首先应该将日期转换到
<code>Calendar</code>。</p>
<p><a name="301813"></a>应用程序应该利用 <code>Calendar</code> 来创建 <code>Date</code>
对象。应用程序在使用 <code>Calendar </code>时,应该负责将所需日期中的时间指定为
00:00:00(因为 JDBC 采用了这种约定)。另外,应用程序在创建 <code>Time</code>
值时,必须将日期 January 1, 1970 指定给为 <code>Time</code> 创建毫秒值的
<code>Calendar</code>,因为这是 JDBC 对时间的约定。</p>
<p><br>
</p>
<hr>
<font size="-1"><a href="jdbc2.0.frame.html">
<p>目录</a> | <a href="jdbc2.0.frame9.html">上一页</a> | <a
href="jdbc2.0.frame11.html">下一页</a> </font></p>
<hr>
<address>
<a href="mailto:jdbc@eng.sun.com">jdbc@eng.sun.com</a> 或 <a
href="mailto:jdbc-business@eng.sun.com">jdbc-business@eng.sun.com</a>
</address>
<a href="../../../relnotes/SMICopyright.html"><font size="-1"><i>
<p>版权所有 © 1996, 1997 Sun Microsystems, Inc. 保留所有权利</i></font>。</a><!-- HTML generated by Suzette Pelouch on June 09, 1998 -->
</p>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -