JSP學習——全面解析JDBC(4)

來源:互聯網
上載者:User
js 如何利用JDBC發送SQL語句?

  Statement對象用於將SQL語句發送到資料庫中。實際上有三種Statement對象,它們都作為在給定串連上執行SQL語句的包容器:Statement、PreparedStatement(它從Statement繼承而來)和CallableStatement(它從PreparedStatement繼承而來)。它們都專用於發送特定類型的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(資料定義語言 (Data Definition Language))語句,例如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版本,使用查詢參數將拋出SQLException。

  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("Rows changed="+count);
stmt.getMoreResults();
continue;
}
if(rowCount==0){//DDL命令或0個更新
System.out.println("No rows changed or statement was DDL command");
stmt.getMoreResults();
continue;
}
//執行到這裡,證明有一個結果集
//或沒有其它結果
ResultSet rs=stmt.getResultSet();
if(rs!=null){
...//使用中繼資料獲得關於結果集列的資訊
while(rs.next()){
...//處理結果
stmt.getMoreResults();
continue;
}
break;//沒有其它結果




相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.