?? 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 + -