?? jdbc-spec.frame14.html
字號(hào):
<!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 動(dòng)態(tài)數(shù)據(jù)庫訪問</h2>
<p>我們期望大多數(shù) JDBC
程序員在編程前應(yīng)具備目標(biāo)數(shù)據(jù)庫機(jī)制的知識(shí)。這樣,在數(shù)據(jù)訪問方面他們就可以使用<a
href="jdbc-spec.frame7.html#20376">第 7 節(jié)</a>中闡述的強(qiáng)大 JDBC
接口。然而,還有一種十分重要的數(shù)據(jù)庫訪問類。在數(shù)據(jù)庫訪問中,應(yīng)用程序(或應(yīng)用程序編寫員)可以動(dòng)態(tài)地查找數(shù)據(jù)庫機(jī)制信息,同時(shí)用這些信息進(jìn)行適當(dāng)?shù)膭?dòng)態(tài)數(shù)據(jù)庫訪問。本節(jié)說明
JDBC 對(duì)動(dòng)態(tài)訪問的支持。 </p>
<p><a name="6540"></a> </p>
<h3>14.1 元數(shù)據(jù)信息</h3>
<p>JDBC
對(duì)多種元數(shù)據(jù)都提供訪問,說明行結(jié)果、語句參數(shù)及數(shù)據(jù)庫屬性等。最初,我們?cè)噲D通過核心
JDBC 類的特殊方法(例如 java.sql.Connection 和 java.sql.ResultSet)來提供這些信息。但由于
metadata 方法較為復(fù)雜且可能只被少部分 JDBC
程序員使用,所以我們決定將 metadata
方法一分為二,改成兩種不同的 Java 接口。 </p>
<p><a name="2565"></a>總的來說,對(duì)于每條元數(shù)據(jù)信息,我們都試著提供單獨(dú)的
JDBC 方法(它們使用適當(dāng)?shù)膮?shù)并提供適當(dāng)?shù)?Java
結(jié)果類型)。但當(dāng)某個(gè)方法(例如 Connection.getProcedures())返回一組數(shù)值時(shí),我們選擇用
java.sql.ResultSet 來存儲(chǔ)這些結(jié)果。這樣,應(yīng)用程序員就可以用常規(guī)的
ResultSet 方法循環(huán)調(diào)用該結(jié)果。 </p>
<p><strong>我們?cè)紤]為檢索元數(shù)據(jù)結(jié)果的集合定義枚舉類型集,但這似乎給接口增加了額外負(fù)擔(dān)而無實(shí)用價(jià)值。JDBC
程序員對(duì)使用 ResultSets
已經(jīng)很熟悉,因此在將它們用于元數(shù)據(jù)結(jié)果時(shí)應(yīng)該不會(huì)有太多麻煩。</strong></p>
<p>許多 metadata 方法將字符串類型的查詢用作參數(shù)。這些查詢模式與
ODBC 中的相同:在 ODBC 中,“ _”表示單個(gè)字母的匹配,“%”表示零個(gè)或多個(gè)字母的匹配。對(duì)于目錄和機(jī)制值,Java
空字符串匹配“未命名”的值;而 Java
零“字符串”則忽略該查詢標(biāo)準(zhǔn)。 </p>
<p>java.sql.ResultSetMetaData 類型為查找某一 java.sql.ResultSet
對(duì)象列的類型和屬性提供了多種方法。 </p>
<p><a name="2573"></a>java.sql.DatabaseMetaData
接口提供查詢與數(shù)據(jù)庫有關(guān)的各種元數(shù)據(jù)的方法。其中包括枚舉數(shù)據(jù)庫中的存儲(chǔ)過程、數(shù)據(jù)庫表、數(shù)據(jù)庫機(jī)制、有效表格類型和有效目錄,也包括查找表格中列的信息、對(duì)列的訪問權(quán)、對(duì)表格的訪問權(quán)及最小行標(biāo)識(shí)等。
</p>
<p><a name="6552"></a> </p>
<h3>14.2 動(dòng)態(tài)類型數(shù)據(jù)訪問</h3>
<a href="jdbc-spec.frame8.html#20986">
<p>第 8 節(jié)</a>中討論了常見的 SQL 類型和 Java 類型之間的映射。例如,SQL
INTEGER 通常映射為 Java int。這可以為將 SQL 值視為簡(jiǎn)單 Java
類型進(jìn)行讀寫提供簡(jiǎn)單的接口。 </p>
<p>此外,為支持通用數(shù)據(jù)訪問,我們也提供將數(shù)據(jù)當(dāng)作通用 Java
對(duì)象進(jìn)行檢索的方法,如 ResultSet.getObject 方法、PreparedStatement.setObject
方法和 CallableStatement.getObject 方法。注意:無論對(duì)于哪個(gè) getObject
方法,都需要在檢索值前將最終 java.lang.Object
對(duì)象的范圍限定為指定的數(shù)據(jù)類型。 </p>
<p><a name="29199"></a>由于 Java 內(nèi)置類型(如 boolean 和 int)不是對(duì)象的子類型,因此對(duì)于
getObject/setObject 方法,從 SQL 類型到 Java
對(duì)象類型映射的方式將稍有不同。該映射見表 <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 對(duì)象類型的映射。 </caption>
<tr>
<td> </td>
</tr>
<tr>
<th>SQL 類型 </th>
<th>Java 對(duì)象類型 </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>相應(yīng)的 Java 對(duì)象類型到 SQL 類型的缺省映射如表 <a
href="jdbc-spec.frame14.html#30877">5</a> 所示。 </p>
<table Border="3">
<caption><a name="30877"></a> 表 5:SQL 類型到 Java 對(duì)象類型的映射。 </caption>
<tr>
<td>注意:字符串的映射一般是 VARCHAR,但如果所給值超過驅(qū)動(dòng)程序限定的
VARCHAR 值時(shí),VARCHAR 將變?yōu)?LONGVARCHAR。對(duì)于 byte[] 與 VARBINARY 和
LONGVARBINARY,情況相似。 </td>
</tr>
<tr>
<th>Java 對(duì)象類型 </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 方法發(fā)送或接收 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 對(duì)象,其類型對(duì)應(yīng)于
ResultSet 列中的 SQL 類型。 </p>
<p><a name="29170"></a>因此,假定有一個(gè) ResultSet,其“a”列有 SQL 類型
CHAR,“b”列有 SQL 類型 SMALLINT,則下面是若干 getObject
調(diào)用返回的類型: </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"); // 獲得一個(gè) String
</code></pre>
<pre><code> Object y = rs.getObject("b"); // 獲得一個(gè) Integer
</code></pre>
<pre><code>}
</code></pre>
<h4>14.2.2 PreparedStatement.setObject</h4>
<p>對(duì)于 PreparedStatement.setObject,用戶可以隨意指定目標(biāo) SQL
類型。這種情況下,參數(shù) Java Object 將首先被映射到其缺省的 SQL
類型(如表 <a href="jdbc-spec.frame14.html#30877">5</a>
所示),然后轉(zhuǎn)換為指定的 SQL 類型(參見表 <a
href="jdbc-spec.frame14.html#37019">6</a> ),最后被發(fā)送給數(shù)據(jù)庫。 </p>
<p>也可以省略目標(biāo) SQL 類型。這種情況下,所給的 Java
對(duì)象將只映射到其缺省的 SQL 類型(使用表 <a
href="jdbc-spec.frame14.html#30877">5</a> ),然后被發(fā)送給數(shù)據(jù)庫。 </p>
<p><a name="29186"></a> </p>
<h4>14.2.3 CallableStatement.getObject</h4>
<p>調(diào)用 CallableStatement.getObject 前,必須先用
CallableStatement.registerOutParameter 指定參數(shù)的 SQL 類型。調(diào)用
CallableStatement.getObject 時(shí),驅(qū)動(dòng)程序?qū)⒎祷貙?duì)應(yīng)于 SQL 類型的 Java
對(duì)象類型(按表 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>版權(quán)所有© 1996, 1997 Sun Microsystems, Inc. 保留所有權(quán)利。</i></font> </a><!-- HTML generated by Suzette Pelouch on April 10, 1998 -->
</p>
</body>
</html>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -