?? jdbc-spec.frame7.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.frame6.html">上一頁</a> | <a href="jdbc-spec.frame8.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="20376"></a> </p>
<h2>7 傳送參數和接收結果</h2>
<p>有關完整的接口描述,參見單獨的 JDBC API 文檔。 </p>
<p><a name="5514"></a><strong>另請參閱附錄 <a href="jdbc-spec.frame15.html#3883">A</a>
中所述的被拒絕的“Holder”機制。</strong></p>
<p><a name="4149"></a> </p>
<h3>7.1 查詢結果</h3>
<p>執行查詢語句的結果將生成一些行,這些行可由 java.sql.ResultSet
對象訪問。ResultSet 對象提供一套“get”方法,允許訪問當前行的不同列。利用
ResultSet.next 方法可實現 ResultSet 行之間移動。 </p>
<pre><code>// 我們將執行返回行集合的 SQL 語句,
</code></pre>
<pre><code>// 其中列 1 為 int、列 2 為 String
</code>// 列 3 為字節數組</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> // 打印當前行的值
</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>指定列的方法有兩種:列索引(更有效)或列名(更方便)。對應地,我們提供以列索引為參數的
getString 方法和以列名為參數的 getString 方法。 </p>
<p><a name="26252"></a><strong>評論家使我們確信:我們必須同時支持列索引和列名。某些評論家強調指出,他們需要高效的數據庫訪問,因此喜歡用列索引,而其它評論家強調他們需要方便地使用列名(注意,某些
SQL
查詢可返回不含列名或含多個相同列名的表。這種情況下,程序員應使用列號)。
</strong></p>
<p>為了最大程度的可移植性,應按由左至右的順序讀取某行的各列,且每列只能讀一次。這反映了在某些基本數據庫協議中存在實現限制。
</p>
<p><a name="26308"></a> </p>
<h4>7.1.1 查詢結果的數據轉換</h4>
<p>ResultSet.getXXX 方法試圖將數據庫返回的 SQL 類型轉換為 getXXX
方法返回的 Java 類型。 </p>
<p><a name="28700"></a><a href="jdbc-spec.frame7.html#30717">第 21 頁的表 1</a>
列出了通過 getXXX 方法實現從 SQL 類型到 Java
類型的轉換。例如,可以使用 getInt 嘗試將 SQL VARCHAR
值作為整數讀取,但不能將 SQL FLOAT 作為 java.sql.Date 讀取。 </p>
<p>如果試圖進行非法轉換或數據轉換失敗(例如對 SQL VARCHAR 值“foo”執行
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 空結果值</h4>
<p>要確定給定結果值是否為 SQL“NULL”,則必須首先讀取列,然后使用
ResultSet wasNull 方法查看是否返回了 SQL“NULL”(另請參閱附錄 <a
href="jdbc-spec.frame15.html#25317">A.9</a>)。 </p>
<p><a name="25307"></a>當使用 getXXX 方法讀取 SQL“NULL”時,將得到:
<ul>
<p><a name="26541"></a></p>
<li>返回 Java 對象的 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 數據,范圍只要不超出 Statement.getMaxFieldSize
值限定的界限。但是,應用程序設計人員會經常發現,在相對較小的固定塊中檢索非常大的數據將更為方便。
</p>
<p>為適應這一點,ResultSet 類可返回 java.io.Input
流,以塊為單位讀取數據。但是,因為調用 ResultSet 的下一個“get”將會使這些流自動關閉,因此必須立即訪問其中的每個流。<strong>這反映了對大塊訪問的基本實現限制。</strong></p>
<p><a name="25069"></a>Java 流返回無類型的字節,并且對 ASCII 和 Unicode
都適用。我們定義了三種獨立的獲得流的方法。 GetBinaryStream
返回的流只提供來自數據庫的原字節而不進行任何轉換。GetAsciiStream
返回的流提供單字節 ASCII 字符。GetUnicodeStream
返回的流則提供兩個字節的 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 的結果:
</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> // 將新填充的緩沖區傳給某些 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(返回單個 ResultSet)或 executeUpdate(可用于任何數據庫修改語句,且返回更新行的計數)執行
SQL 語句。 </p>
<p><a name="20214"></a>但在某些環境下,應用程序在語句執行前可能不知道給定語句是否返回
ResultSet。另外,某些存儲過程可能返回多個不同的 ResultSet 和/或更新計數。
</p>
<p><a name="20231"></a>為適應這些需要,我們提供一種機制,以使應用程序能執行語句,然后處理
ResultSet 的任意集合并更新計數。該機制基于完全通用的“execute”方法,并得到方法
getResultSet、getUpdateCount 和 getMoreResults
的支持。這些方法允許應用程序每次查詢一個語句結果并確定給定結果是
ResultSet 還是更新計數。 </p>
<p><a name="20240"></a> </p>
<h3>7.2 傳遞 IN 參數</h3>
<p>為將參數傳遞到 SQL 語句,java.sql.PreparedStatemen 類提供了一系列
setXXX
方法。這些方法可用來在每一次語句執行前填充參數域。一旦為給定語句定義了參數值,該參數值就可用于語句的多重執行,直到調用
PreparedStatement.clearParameters 清除這一參數為止。 </p>
<pre><code>java.sql.PreparedStatement stmt = conn.prepareStatement(
</code></pre>
<pre><code> "UPDATE table3 SET m = ? WHERE x = ?");
</code></pre>
<pre><code>// 傳遞兩個參數。一個在每次 for 循環中都改變,
</code></pre>
<pre><code>// 另一個為常量。
</code></pre>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -