C語言中文網 目錄
JSP教程
1 JSP是什么
2 JSP的特點與工作流程
3 JSP與ASP、PHP的比較
4 JSP頁面的組成及其元素
5 JSP開發環境搭建
6 第一個JSP程序
7 JSP注釋
8 JSP聲明
9 JSP中嵌入Java代碼
10 JSP表達式
11 JSP開發模式
12 JSP常見錯誤
13 JSP指令
14 JSP page指令
15 JSP include指令
16 JSP指令應用實例
17 JSP動作
18 JSP include動作
19 JSP param動作
20 JSP forward動作
21 JSP plugin動作
22 JSP useBean動作
23 JSP setProperty動作
24 JSP getProperty動作
25 JSP application 對象
26 JSP out對象
27 JSP request對象
28 JSP response對象
29 JSP session對象
30 JSP pageContext對象
31 JSP page對象
32 JSP config對象
33 JSP獲取并顯示字符串長度
34 什么是JavaBean
35 JavaBean工具
36 JavaBean規范
37 JavaBean屬性
38 JavaBean Scope屬性
39 JavaBean事件
40 JavaBean實現用戶登錄界面
41 Servlet是什么
42 Servlet生命周期
43 Servlet的類和方法
44 Servlet客戶端跳轉
45 EL是什么
46 EL表達式的基本語法及運算符的優先級
47 JSP EL 點(.)運算符和下標([])運算符
48 JSP EL算數運算符
49 JSP EL關系運算符
50 JSP EL邏輯運算符
51 JSP EL條件運算符
52 JSP EL empty空運算符
53 EL表達式中的常量與變量
54 EL表達式的保留字
55 EL表達式的內置對象及其作用域
56 使用EL表達式訪問JavaBean
57 使用EL表達式訪問集合
58 EL表達式內置對象param和paramValues
59 EL表達式內置對象cookie
60 EL表達式內置對象initParam
61 JDBC 的定義及產品組件
62 建立JDBC連接
63 利用JDBC發送SQL語句
64 JDBC API ResultSet接口
65 JDBC RowSet接口
66 JDBC BaseRowSet類和CachedRowSet類
67 填充CachedRowSet對象記錄集
68 File類
69 使用字節流讀/寫文件
70 RandomAccessFile 類
71 JSP文件上傳
72 XML是什么
73 XML的基本語法
74 JDK 中的 XML API
75 DOM解析XML
76 SAX解析XML
77 DOM4j解析XML
首頁 > JSP教程 閱讀:203

利用JDBC發送SQL語句

Statement 對象用于將 SQL 語句發送到數據庫。實際上有三種 Statement 對象,它們都作為在給定連接上執行 SQL 語句的包容器:Statement、PreparedStatement(它從 Statement 繼承而來)和 CallableStatement(它從 PreparedStatement 繼承而來)。

以上三種 Statement 對象都專用于發送特定類型的 SQL 語句:
  • Statement 對象用于執行不帶參數的簡單 SQL 語句;
  • PreparedStatement 對象用于執行帶或不帶 IN 參數的預編譯 SQL 語句;
  • CallableStatement 對象用于執行對數據庫己存儲過程的調用;

Statement 接口提供了執行語句和獲取結果的基本方法;PreparedStatement 接口添加了處理 IN 參數的方法;而 CallableStatement 添加了處理 OUT 參數的方法。

1. 創建Statement對象

建立到特定數據庫的連接之后,就可用該連接發送 SQL 語句了。Statement 對象用 Connection 的方法 createStatement 創建,如下列代碼段所示:
Connection con=DriverManager.getConnection(url,"sunny","");
Statement stmt=con.createStatement();

為了執行 Statement 對象,被發送到數據庫的 SQL 語句將被作為參數提供給 Statement 的方法:
ResultSet rs=stmt.executeQuery("SELECT a,b,c FROM Table2");

2. 使用Statement對象執行語句

Statement 接口提供了三種執行 SQL 語句的方法:executeQuery、executeUpdate 和 execute。使用哪一個方法由 SQL 語句所產生的內容決定。

executeQuery 方法用于產生單個結果集的語句,例如 SELECT 語句。executeUpdate 方法用于執行 INSERT、UPDATE 或 DELETE 語句以及 SQL DDL(數據定義語言)語句,例如 CREATE TABLE 和 DROP TABLE。

INSERT、UPDATE 或 DELETE 語句的效果是修改表中零行或多行中的一列或多列。executeUpdate 的返回值是一個整數,指示受影響的行數(即 更新計數)。對于 CREATE TABLE 或 DROP TABLE 等不操作行的語句,executeUpdate 的返回值總為零。

執行語句的所有方法都將關閉所調用的 Statement 對象的當前打開結果集(如果存在)。這意味著在重新執行 Statement 對象之前,需要完成對當前 ResultSet 對象的處理。應注意,繼承了 Statement 接口中所有方法的 PreparedStatement 接口都有自己的 executeQuery、executeUpdate 和 execute 方法。

Statement 對象本身不包含 SQL 語句,因而必須給 Statement.execute 方法提供 SQL 語句作為參數。PreparedStatement 對象并不需要 SQL 語句作為參數提供給這些方法,因為它們己經包含預編譯 SQL 語句。

CallableStatement 對象繼承這些方法的 PreparedStatement 形式。對于這些方法的 PreparedStatement 或 CallableStatement 版本,使用查詢參數將拋出 SQL Exception。

3. 語句完成

當連接處于自動提交模式時,其中所執行的語句在完成時將自動提交或還原。語句在已執行且所有結果返回時,即認為己完成。對于返回一個結果集的 executeQuery 方法,在檢索完 ResultSet 對象的所有行時該語句完成。對于方法 executeUpdate,當它執行時語句即完成。但在少數調用方法 execute 的情況中,在檢索所有結果集或它生成的更新計數之后語句才完成。

有些 DBMS 將已存儲過程中的每條語句視為獨立的語句;而另外一些則將整個過程視為一個復合語句。在啟用自動提交時,這種差別就變得非常重要,因為它會影響什么時候調用 commit 方法。在前一種情況中,每條語句單獨提交;在后一種情況中,所有語句同時提交。

4. 關閉Statement對象

Statement 對象將由 Java 垃圾收集程序自動關閉。而作為一種好的編程風格,應在不需要 Statement 對象時顯式地關閉它們。這將立即釋放 DBMS 資源,有助于避免潛在的內存問題。

5. 使用execute方法

execute 方法應該僅在語句能返回多個 ResultSet 對象、多個更新計數或 ResultSet 對象與更新計數的組合時使用。

當執行某個已存儲過程或動態執行未知 SQL 字符串(即應用程序程序員在編譯時未知)時,有可能出現多個結果的情況,盡管這種情況很少見。例如,用戶可能執行一個已存儲過程,并且該已存儲過程可執行更新,然后執行選擇,再進行更新,再進行選擇。通常使用已存儲過程的人應知道它所返回的內容。

因為方法 execute 處理非常規情況,所以獲取其結果需要一些特殊處理并不足為怪。

例如,假定已知某個過程返回兩個結果集,則在使用方法 execute 執行該過程后,必須調用方法 getResultSet 獲得第一個結果集,然后調用適當的 getXXX 方法獲取其中的值。要獲得第二個結果集,需要先調用 getMoreResults 方法,然后再調用 getResultSet 方法。

如果已知某個過程返回兩個更新計數,則首先調用方法 getUpdateCount,然后調用 getMoreResults,并再次調用 getUpdateCount。

若不知道返回內容,則情況更為復雜。如果結果是 ResultSet 對象,則方法 execute 返回 true;如果結果是 Javaint,則返回 false。如果返回 int,則意味著結果是更新計數或執行的語句是 DL 命令。

在調用方法 execute 之后要做的第一件事是調用 getResultSet 或 getUpdateCount。調用方法 getResultSet 可以獲得兩個或多個 ResultSet 對象中的第一個對象;調用方法 getUpdateCount 可以獲得兩個或多個更新計數中的第一個更新計數的內容。

當 SQL 語句的結果不是結果集時,getResultSet 方法將返回 null。這可能意味著結果是一個更新計數或沒有其他結果。在這種情況下,判斷 null 真正含義的唯一方法是調用 getUpdateCount 方法,它將返回一個整數。這個整數為調用語句所影響的行數;如果為 -1 則表示結果是結果集或沒有結果。如果 getResultSet 方法已返回 null(表示結果不是 ResultSet 對象),則返回值 -1 表示沒有其他結果。也就是說,當下列條件為真時表示沒有結果(或沒有其他結果):

((stmt.getResultSet()==null)&&(stmt.getUpdateCount()==-1))


如果己經調用方法 getResultSet 并處理了它返回的 ResultSet 對象,則有必要調用方法 getMoreResults 以確定是否有其他結果集或更新計數。如果 getMoreResults 返回 true,則需要再次調用 getResultSet 來檢索下一個結果集。如上所述,如果 getResultSet 返回 null,則需要調用 getUpdateCount 來檢查 null 是表示結果為更新計數還是表示沒有其他結果。

當 getMoreResults 返回 false 時,表示該 SQL 語句返回一個更新計數或沒有其他結果。因此需要調用方法 getUpdateCount 來檢查它是哪一種情況。在這種情況下,當下列條件為真時表示沒有其他結果:

((stmt.getMoreResults()==false)&&(stmt.getUpdateCount()==-1))


下面的代碼演示了用來確認已訪問調用方法 execute 所產生的全部結果集和更新計數的一種方法:
stmt.execute(queryStringWithUnknownResults);
while(true)
{
    introwCount=stmt.getUpdateCount();
    if(rowCount>0)
    {    //它是更新計數
        System.out.println(nRows changed=u+count);
        stmt.getMoreResults();
        continue;
    }
    if(rowCount==0)
    {    //DDL命令或0個更新
        System.out.println("No rows changed or statement was DDL command11);

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo