?? jdbc-spec.frame7.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.frame6.html">上一頁(yè)</a> | <a href="jdbc-spec.frame8.html">下一頁(yè)</a>
</font></td>
<td align="right"><i>JDBC<sup><font size="-2">TM</font></sup> 指南:入門(mén)</i></td>
</tr>
</table>
<hr>
<p><br>
<a name="20376"></a> </p>
<h2>7 傳送參數(shù)和接收結(jié)果</h2>
<p>有關(guān)完整的接口描述,參見(jiàn)單獨(dú)的 JDBC API 文檔。 </p>
<p><a name="5514"></a><strong>另請(qǐng)參閱附錄 <a href="jdbc-spec.frame15.html#3883">A</a>
中所述的被拒絕的“Holder”機(jī)制。</strong></p>
<p><a name="4149"></a> </p>
<h3>7.1 查詢(xún)結(jié)果</h3>
<p>執(zhí)行查詢(xún)語(yǔ)句的結(jié)果將生成一些行,這些行可由 java.sql.ResultSet
對(duì)象訪(fǎng)問(wèn)。ResultSet 對(duì)象提供一套“get”方法,允許訪(fǎng)問(wèn)當(dāng)前行的不同列。利用
ResultSet.next 方法可實(shí)現(xiàn) ResultSet 行之間移動(dòng)。 </p>
<pre><code>// 我們將執(zhí)行返回行集合的 SQL 語(yǔ)句,
</code></pre>
<pre><code>// 其中列 1 為 int、列 2 為 String
</code>// 列 3 為字節(jié)數(shù)組</pre>
<pre><code>//
</code></pre>
<pre><code>java.sql.Statement stmt = conn.createStatement();
</code></pre>
<pre><code>ResultSet r = stmt.executeQuery("SELECT a, b, c FROM Table1");
</code></pre>
<pre><code>while (r.next()) {
</code></pre>
<pre><code> // 打印當(dāng)前行的值
</code></pre>
<pre><code> int i = r.getInt("a");
</code></pre>
<pre><code> String s = r.getString("b");
</code></pre>
<pre><code> byte b[] = r.getBytes("c");
</code></pre>
<pre><code> System.out.println("ROW = " + i + " " + s + " " + b[0]);
</code></pre>
<pre><code>}
</code></pre>
<p>指定列的方法有兩種:列索引(更有效)或列名(更方便)。對(duì)應(yīng)地,我們提供以列索引為參數(shù)的
getString 方法和以列名為參數(shù)的 getString 方法。 </p>
<p><a name="26252"></a><strong>評(píng)論家使我們確信:我們必須同時(shí)支持列索引和列名。某些評(píng)論家強(qiáng)調(diào)指出,他們需要高效的數(shù)據(jù)庫(kù)訪(fǎng)問(wèn),因此喜歡用列索引,而其它評(píng)論家強(qiáng)調(diào)他們需要方便地使用列名(注意,某些
SQL
查詢(xún)可返回不含列名或含多個(gè)相同列名的表。這種情況下,程序員應(yīng)使用列號(hào))。
</strong></p>
<p>為了最大程度的可移植性,應(yīng)按由左至右的順序讀取某行的各列,且每列只能讀一次。這反映了在某些基本數(shù)據(jù)庫(kù)協(xié)議中存在實(shí)現(xiàn)限制。
</p>
<p><a name="26308"></a> </p>
<h4>7.1.1 查詢(xún)結(jié)果的數(shù)據(jù)轉(zhuǎn)換</h4>
<p>ResultSet.getXXX 方法試圖將數(shù)據(jù)庫(kù)返回的 SQL 類(lèi)型轉(zhuǎn)換為 getXXX
方法返回的 Java 類(lèi)型。 </p>
<p><a name="28700"></a><a href="jdbc-spec.frame7.html#30717">第 21 頁(yè)的表 1</a>
列出了通過(guò) getXXX 方法實(shí)現(xiàn)從 SQL 類(lèi)型到 Java
類(lèi)型的轉(zhuǎn)換。例如,可以使用 getInt 嘗試將 SQL VARCHAR
值作為整數(shù)讀取,但不能將 SQL FLOAT 作為 java.sql.Date 讀取。 </p>
<p>如果試圖進(jìn)行非法轉(zhuǎn)換或數(shù)據(jù)轉(zhuǎn)換失敗(例如對(duì) SQL VARCHAR 值“foo”執(zhí)行
getInt),則將拋出 SQLException。 </p>
<p><a name="30761"></a> </p>
<p align="center"><a name="30758"></a> <a name="30717"></a><img src="table1.gif"
width="522" height="567"> </p>
<p><a name="30760"></a> </p>
<h4>7.1.2 空結(jié)果值</h4>
<p>要確定給定結(jié)果值是否為 SQL“NULL”,則必須首先讀取列,然后使用
ResultSet wasNull 方法查看是否返回了 SQL“NULL”(另請(qǐng)參閱附錄 <a
href="jdbc-spec.frame15.html#25317">A.9</a>)。 </p>
<p><a name="25307"></a>當(dāng)使用 getXXX 方法讀取 SQL“NULL”時(shí),將得到:
<ul>
<p><a name="26541"></a></p>
<li>返回 Java 對(duì)象的 getXXX 方法返回的 Java“null”值<br>
<br>
<a name="26542"></a> </li>
<li>getByte、getShort、getInt、getLong、getFloat 和 getDouble 返回的零值<br>
<br>
<a name="27824"></a> </li>
<li>getBoolean. 返回的 false 值<br>
<br>
</li>
</ul>
<p><a name="27826"></a></p>
<h4>7.1.3 檢索特大行值</h4>
<p>JDBC 允許使用 getBytes 和 getString 檢索任意大的 LONGVARBINARY 或
LONGVARCHAR 數(shù)據(jù),范圍只要不超出 Statement.getMaxFieldSize
值限定的界限。但是,應(yīng)用程序設(shè)計(jì)人員會(huì)經(jīng)常發(fā)現(xiàn),在相對(duì)較小的固定塊中檢索非常大的數(shù)據(jù)將更為方便。
</p>
<p>為適應(yīng)這一點(diǎn),ResultSet 類(lèi)可返回 java.io.Input
流,以塊為單位讀取數(shù)據(jù)。但是,因?yàn)檎{(diào)用 ResultSet 的下一個(gè)“get”將會(huì)使這些流自動(dòng)關(guān)閉,因此必須立即訪(fǎng)問(wèn)其中的每個(gè)流。<strong>這反映了對(duì)大塊訪(fǎng)問(wèn)的基本實(shí)現(xiàn)限制。</strong></p>
<p><a name="25069"></a>Java 流返回?zé)o類(lèi)型的字節(jié),并且對(duì) ASCII 和 Unicode
都適用。我們定義了三種獨(dú)立的獲得流的方法。 GetBinaryStream
返回的流只提供來(lái)自數(shù)據(jù)庫(kù)的原字節(jié)而不進(jìn)行任何轉(zhuǎn)換。GetAsciiStream
返回的流提供單字節(jié) ASCII 字符。GetUnicodeStream
返回的流則提供兩個(gè)字節(jié)的 Unicode 字符。 </p>
<p><a name="25098"></a>例如: </p>
<pre><code>java.sql.Statement stmt = conn.createStatement();
</code></pre>
<pre><code>ResultSet r = stmt.executeQuery("SELECT x FROM Table2");
</code></pre>
<pre><code>// 在 4 K 的塊中檢索列 1 的結(jié)果:
</code></pre>
<pre><code>byte[] buff = new byte[4096];
</code></pre>
<pre><code>while (r.next()) {
</code></pre>
<pre><code> java.io.InputStream fin = r.getAsciiStream("x");
</code></pre>
<pre><code> for (;;) {
</code></pre>
<pre><code> int size = fin.read(buff);
</code></pre>
<pre><code> if (size == -1) {
</code></pre>
<pre><code> break;
</code></pre>
<pre><code> }
</code></pre>
<pre><code> // 將新填充的緩沖區(qū)傳給某些 ASCII 輸出流:
</code></pre>
<pre><code> output.write(buff, 0, size);
</code></pre>
<pre><code> }
</code></pre>
<pre><code>}
</code></pre>
<h4>7.1.4 可選或多重 ResultSet</h4>
<p>我們通常希望使用 executeQuery(返回單個(gè) ResultSet)或 executeUpdate(可用于任何數(shù)據(jù)庫(kù)修改語(yǔ)句,且返回更新行的計(jì)數(shù))執(zhí)行
SQL 語(yǔ)句。 </p>
<p><a name="20214"></a>但在某些環(huán)境下,應(yīng)用程序在語(yǔ)句執(zhí)行前可能不知道給定語(yǔ)句是否返回
ResultSet。另外,某些存儲(chǔ)過(guò)程可能返回多個(gè)不同的 ResultSet 和/或更新計(jì)數(shù)。
</p>
<p><a name="20231"></a>為適應(yīng)這些需要,我們提供一種機(jī)制,以使應(yīng)用程序能執(zhí)行語(yǔ)句,然后處理
ResultSet 的任意集合并更新計(jì)數(shù)。該機(jī)制基于完全通用的“execute”方法,并得到方法
getResultSet、getUpdateCount 和 getMoreResults
的支持。這些方法允許應(yīng)用程序每次查詢(xún)一個(gè)語(yǔ)句結(jié)果并確定給定結(jié)果是
ResultSet 還是更新計(jì)數(shù)。 </p>
<p><a name="20240"></a> </p>
<h3>7.2 傳遞 IN 參數(shù)</h3>
<p>為將參數(shù)傳遞到 SQL 語(yǔ)句,java.sql.PreparedStatemen 類(lèi)提供了一系列
setXXX
方法。這些方法可用來(lái)在每一次語(yǔ)句執(zhí)行前填充參數(shù)域。一旦為給定語(yǔ)句定義了參數(shù)值,該參數(shù)值就可用于語(yǔ)句的多重執(zhí)行,直到調(diào)用
PreparedStatement.clearParameters 清除這一參數(shù)為止。 </p>
<pre><code>java.sql.PreparedStatement stmt = conn.prepareStatement(
</code></pre>
<pre><code> "UPDATE table3 SET m = ? WHERE x = ?");
</code></pre>
<pre><code>// 傳遞兩個(gè)參數(shù)。一個(gè)在每次 for 循環(huán)中都改變,
</code></pre>
<pre><code>// 另一個(gè)為常量。
</code></pre>
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -