📄 jdbc-spec.frame14.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="600">
<tr>
<td><font size="-1"><a href="jdbc-spec.frame.html">目录</a> | <a
href="jdbc-spec.frame13.html">上一页</a> | <a href="jdbc-spec.frame15.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="50686"></a> </p>
<h2>14 动态数据库访问</h2>
<p>我们期望大多数 JDBC
程序员在编程前应具备目标数据库机制的知识。这样,在数据访问方面他们就可以使用<a
href="jdbc-spec.frame7.html#20376">第 7 节</a>中阐述的强大 JDBC
接口。然而,还有一种十分重要的数据库访问类。在数据库访问中,应用程序(或应用程序编写员)可以动态地查找数据库机制信息,同时用这些信息进行适当的动态数据库访问。本节说明
JDBC 对动态访问的支持。 </p>
<p><a name="6540"></a> </p>
<h3>14.1 元数据信息</h3>
<p>JDBC
对多种元数据都提供访问,说明行结果、语句参数及数据库属性等。最初,我们试图通过核心
JDBC 类的特殊方法(例如 java.sql.Connection 和 java.sql.ResultSet)来提供这些信息。但由于
metadata 方法较为复杂且可能只被少部分 JDBC
程序员使用,所以我们决定将 metadata
方法一分为二,改成两种不同的 Java 接口。 </p>
<p><a name="2565"></a>总的来说,对于每条元数据信息,我们都试着提供单独的
JDBC 方法(它们使用适当的参数并提供适当的 Java
结果类型)。但当某个方法(例如 Connection.getProcedures())返回一组数值时,我们选择用
java.sql.ResultSet 来存储这些结果。这样,应用程序员就可以用常规的
ResultSet 方法循环调用该结果。 </p>
<p><strong>我们曾考虑为检索元数据结果的集合定义枚举类型集,但这似乎给接口增加了额外负担而无实用价值。JDBC
程序员对使用 ResultSets
已经很熟悉,因此在将它们用于元数据结果时应该不会有太多麻烦。</strong></p>
<p>许多 metadata 方法将字符串类型的查询用作参数。这些查询模式与
ODBC 中的相同:在 ODBC 中,“ _”表示单个字母的匹配,“%”表示零个或多个字母的匹配。对于目录和机制值,Java
空字符串匹配“未命名”的值;而 Java
零“字符串”则忽略该查询标准。 </p>
<p>java.sql.ResultSetMetaData 类型为查找某一 java.sql.ResultSet
对象列的类型和属性提供了多种方法。 </p>
<p><a name="2573"></a>java.sql.DatabaseMetaData
接口提供查询与数据库有关的各种元数据的方法。其中包括枚举数据库中的存储过程、数据库表、数据库机制、有效表格类型和有效目录,也包括查找表格中列的信息、对列的访问权、对表格的访问权及最小行标识等。
</p>
<p><a name="6552"></a> </p>
<h3>14.2 动态类型数据访问</h3>
<a href="jdbc-spec.frame8.html#20986">
<p>第 8 节</a>中讨论了常见的 SQL 类型和 Java 类型之间的映射。例如,SQL
INTEGER 通常映射为 Java int。这可以为将 SQL 值视为简单 Java
类型进行读写提供简单的接口。 </p>
<p>此外,为支持通用数据访问,我们也提供将数据当作通用 Java
对象进行检索的方法,如 ResultSet.getObject 方法、PreparedStatement.setObject
方法和 CallableStatement.getObject 方法。注意:无论对于哪个 getObject
方法,都需要在检索值前将最终 java.lang.Object
对象的范围限定为指定的数据类型。 </p>
<p><a name="29199"></a>由于 Java 内置类型(如 boolean 和 int)不是对象的子类型,因此对于
getObject/setObject 方法,从 SQL 类型到 Java
对象类型映射的方式将稍有不同。该映射见表 <a
href="jdbc-spec.frame14.html#6941">4</a> 所示。 </p>
<p><a name="6970"></a> </p>
<table Border="3">
<caption><a name="6941"></a> 表 4 : 从 SQL 类型到 Java 对象类型的映射。 </caption>
<tr>
<td> </td>
</tr>
<tr>
<th>SQL 类型 </th>
<th>Java 对象类型 </th>
</tr>
<tr>
<td>CHAR </td>
<td>String </td>
</tr>
<tr>
<td>VARCHAR </td>
<td>String </td>
</tr>
<tr>
<td>LONGVARCHAR </td>
<td>String </td>
</tr>
<tr>
<td>NUMERIC </td>
<td>java.math.BigDecimal </td>
</tr>
<tr>
<td>DECIMAL </td>
<td>java.math.BigDecimal </td>
</tr>
<tr>
<td>BIT </td>
<td>Boolean </td>
</tr>
<tr>
<td>TINYINT </td>
<td>Integer </td>
</tr>
<tr>
<td>SMALLINT </td>
<td>Integer </td>
</tr>
<tr>
<td>INTEGER </td>
<td>Integer </td>
</tr>
<tr>
<td>BIGINT </td>
<td>Long </td>
</tr>
<tr>
<td>REAL </td>
<td>Float </td>
</tr>
<tr>
<td>FLOAT </td>
<td>Double </td>
</tr>
<tr>
<td>DOUBLE </td>
<td>Double </td>
</tr>
<tr>
<td>BINARY </td>
<td>byte[] </td>
</tr>
<tr>
<td>VARBINARY </td>
<td>byte[] </td>
</tr>
<tr>
<td>LONGVARBINARY </td>
<td>byte[] </td>
</tr>
<tr>
<td>DATE </td>
<td>java.sql.Date </td>
</tr>
<tr>
<td>TIME </td>
<td>java.sql.Time </td>
</tr>
<tr>
<td>TIMESTAMP </td>
<td>java.sql.Timestamp </td>
</tr>
</table>
<table>
<tr>
<td></td>
</tr>
</table>
<p><a name="28809"></a> </p>
<p><a name="30822"></a> </p>
<p><a name="30881"></a>相应的 Java 对象类型到 SQL 类型的缺省映射如表 <a
href="jdbc-spec.frame14.html#30877">5</a> 所示。 </p>
<table Border="3">
<caption><a name="30877"></a> 表 5:SQL 类型到 Java 对象类型的映射。 </caption>
<tr>
<td>注意:字符串的映射一般是 VARCHAR,但如果所给值超过驱动程序限定的
VARCHAR 值时,VARCHAR 将变为 LONGVARCHAR。对于 byte[] 与 VARBINARY 和
LONGVARBINARY,情况相似。 </td>
</tr>
<tr>
<th>Java 对象类型 </th>
<th>SQL 类型 </th>
</tr>
<tr>
<td>String </td>
<td>VARCHAR 或 LONGVARCHAR </td>
</tr>
<tr>
<td>java.math.BigDecimal </td>
<td>NUMERIC </td>
</tr>
<tr>
<td>Boolean </td>
<td>BIT </td>
</tr>
<tr>
<td>Integer </td>
<td>INTEGER </td>
</tr>
<tr>
<td>Long </td>
<td>BIGINT </td>
</tr>
<tr>
<td>Float </td>
<td>REAL </td>
</tr>
<tr>
<td>Double </td>
<td>DOUBLE </td>
</tr>
<tr>
<td>byte[] </td>
<td>VARBINARY 或 LONGVARBINARY </td>
</tr>
<tr>
<td>java.sql.Date </td>
<td>DATE </td>
</tr>
<tr>
<td>java.sql.Time </td>
<td>TIME </td>
</tr>
<tr>
<td>java.sql.Timestamp </td>
<td>TIMESTAMP </td>
</tr>
</table>
<table>
<tr>
<td></td>
</tr>
</table>
<p><a name="30882"></a> </p>
<p>注意:不能用 getObject 或 setObject 方法发送或接收 Java
输入流。用户必须显式地用 PreparedStatement.setXXXStream 或 ResultSet.getXXX
Stream 传输作为流的值。 </p>
<p><a name="30802"></a> </p>
<p><a name="29165"></a> </p>
<h4>14.2.1 ResultSet.getObject</h4>
<p>利用表 <a href="jdbc-spec.frame14.html#6941">4</a> 所列的映射方式,<a
name="29208"></a>ResultSet.getObject 可以返回 Java 对象,其类型对应于
ResultSet 列中的 SQL 类型。 </p>
<p><a name="29170"></a>因此,假定有一个 ResultSet,其“a”列有 SQL 类型
CHAR,“b”列有 SQL 类型 SMALLINT,则下面是若干 getObject
调用返回的类型: </p>
<pre><code>ResultSet rs = stmt.executeQuery("SELECT a, b FROM foo");
</code></pre>
<pre><code>while (rs.next()) {
</code></pre>
<pre><code> Object x = rs.getObject("a"); // 获得一个 String
</code></pre>
<pre><code> Object y = rs.getObject("b"); // 获得一个 Integer
</code></pre>
<pre><code>}
</code></pre>
<h4>14.2.2 PreparedStatement.setObject</h4>
<p>对于 PreparedStatement.setObject,用户可以随意指定目标 SQL
类型。这种情况下,参数 Java Object 将首先被映射到其缺省的 SQL
类型(如表 <a href="jdbc-spec.frame14.html#30877">5</a>
所示),然后转换为指定的 SQL 类型(参见表 <a
href="jdbc-spec.frame14.html#37019">6</a> ),最后被发送给数据库。 </p>
<p>也可以省略目标 SQL 类型。这种情况下,所给的 Java
对象将只映射到其缺省的 SQL 类型(使用表 <a
href="jdbc-spec.frame14.html#30877">5</a> ),然后被发送给数据库。 </p>
<p><a name="29186"></a> </p>
<h4>14.2.3 CallableStatement.getObject</h4>
<p>调用 CallableStatement.getObject 前,必须先用
CallableStatement.registerOutParameter 指定参数的 SQL 类型。调用
CallableStatement.getObject 时,驱动程序将返回对应于 SQL 类型的 Java
对象类型(按表 4 指定的映射)。 </p>
<p align="center"><a name="37019"></a><img src="table2.gif" width="523" height="462"> </p>
<p><a name="37449"></a> </p>
<p><br>
</p>
<hr>
<font size="-1"><a href="jdbc-spec.frame.html">
<p>目录</a> | <a href="jdbc-spec.frame13.html">上一页</a> | <a
href="jdbc-spec.frame15.html">下一页</a> </font></p>
<hr>
<address>
<a href="mailto:jdbc@wombat.eng.sun.com">jdbc@wombat.eng.sun.com</a> 或 <a
href="mailto:jdbc-odbc@wombat.eng.sun.com">jdbc-odbc@wombat.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 April 10, 1998 -->
</p>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -