⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jdbc-spec.frame14.html

📁 JDBC入门中文文档
💻 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(&quot;SELECT a, b FROM foo&quot;);
</code></pre>

<pre><code>while (rs.next()) {
</code></pre>

<pre><code>	Object x = rs.getObject(&quot;a&quot;);							 // 获得一个 String
</code></pre>

<pre><code>	Object y = rs.getObject(&quot;b&quot;);							 // 获得一个 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>版权所有&copy; 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 + -