execute、executequery和executeupdate之間的區(qū)別是什么
單車間調(diào)度問題(Job-shop scheduling problem, JSP)是最基本、最著名的調(diào)度問題,也是NP難問題,無最優(yōu)解精確算法。下面是學(xué)習(xí)啦小編為你整理的JSP面試題,希望對你有所幫助!
在用純JSP做一個頁面報警功能的時候習(xí)慣性的用executeQuery來執(zhí)行SQL語句,結(jié)果執(zhí)行update時就遇到問題,語句能執(zhí)行,但返回結(jié)果出現(xiàn)問題,另外還忽略了executeUpdate的返回值不是結(jié)果集ResultSet,而是數(shù)值!特收藏如下一篇文章(感謝網(wǎng)友們對各種信息的貢獻(xiàn)): JDBCTM中Statement接口提供的execute、executeQuery和executeUpdate之間的區(qū)別 Statement 接口提供了三種執(zhí)行 SQL 語句的方法:executeQuery、executeUpdate 和 execute。使用哪一個方法由 SQL 語句所產(chǎn)生的內(nèi)容決定。 方法executeQuery 用于產(chǎn)生單個結(jié)果集的語句,例如 SELECT 語句。 被使用最多的執(zhí)行 SQL 語句的方法是 executeQuery。這個方法被用來執(zhí)行 SELECT 語句,它幾乎是使用最多的 SQL 語句。 方法executeUpdate 用于執(zhí)行 INSERT、UPDATE 或 DELETE 語句以及 SQL DDL(數(shù)據(jù)定義語言)語句,例如 CREATE TABLE 和 DROP TABLE。INSERT、UPDATE 或 DELETE 語句的效果是修改表中零行或多行中的一列或多列。executeUpdate 的返回值是一個整數(shù),指示受影響的行數(shù)(即更新計數(shù))。對于 CREATE TABLE 或 DROP TABLE 等不操作行的語句,executeUpdate 的返回值總為零。 使用executeUpdate方法是因為在 createTableCoffees 中的 SQL 語句是 DDL (數(shù)據(jù)定義語言)語句。創(chuàng)建表,改變表,刪除表都是 DDL 語句的例子,要用 executeUpdate 方法來執(zhí)行。你也可以從它的名字里看出,方法 executeUpdate 也被用于執(zhí)行更新表 SQL 語句。實際上,相對于創(chuàng)建表來說,executeUpdate 用于更新表的時間更多,因為表只需要創(chuàng)建一次,但經(jīng)常被更新。 方法execute: 用于執(zhí)行返回多個結(jié)果集、多個更新計數(shù)或二者組合的語句。因為多數(shù)程序員不會需要該高級功能 execute方法應(yīng)該僅在語句能返回多個ResultSet對象、多個更新計數(shù)或ResultSet對象與更新計數(shù)的組合時使用。當(dāng)執(zhí)行某個已存儲過程 或動態(tài)執(zhí)行未知 SQL 字符串(即應(yīng)用程序程序員在編譯時未知)時,有可能出現(xiàn)多個結(jié)果的情況,盡管這種情況很少見。 因為方法 execute 處理非常規(guī)情況,所以獲取其結(jié)果需要一些特殊處理并不足為怪。例如,假定已知某個過程返回兩個結(jié)果集,則在使用方法 execute 執(zhí)行該過程后,必須調(diào)用方法 getResultSet 獲得第一個結(jié)果集,然后調(diào)用適當(dāng)?shù)?getXXX 方法獲取其中的值。要獲得第二個結(jié)果集,需要先調(diào)用 getMoreResults 方法,然后再調(diào)用 getResultSet 方法。如果已知某個過程返回兩個更新計數(shù),則首先調(diào)用方法 getUpdateCount,然后調(diào)用 getMoreResults,并再次調(diào)用 getUpdateCount。 對于不知道返回內(nèi)容,則情況更為復(fù)雜。如果結(jié)果是 ResultSet 對象,則方法 execute 返回 true;如果結(jié)果是 Java int,則返回 false。如果返回 int,則意味著結(jié)果是更新計數(shù)或執(zhí)行的語句是 DDL 命令。在調(diào)用方法 execute 之后要做的第一件事情是調(diào)用 getResultSet 或 getUpdateCount。調(diào)用方法 getResultSet 可以獲得兩個或多個 ResultSet 對象中第一個對象;或調(diào)用方法 getUpdateCount 可以獲得兩個或多個更新計數(shù)中第一個更新計數(shù)的內(nèi)容。 當(dāng) SQL 語句的結(jié)果不是結(jié)果集時,則方法 getResultSet 將返回 null。這可能意味著結(jié)果是一個更新計數(shù)或沒有其它結(jié)果。在這種情況下,判斷 null 真正含義的唯一方法是調(diào)用方法 getUpdateCount,它將返回一個整數(shù)。這個整數(shù)為調(diào)用語句所影響的行數(shù);如果為 -1 則表示結(jié)果是結(jié)果集或沒有結(jié)果。如果方法 getResultSet 已返回 null(表示結(jié)果不是 ResultSet 對象),則返回值 -1 表示沒有其它結(jié)果。也就是說,當(dāng)下列條件為真時表示沒有結(jié)果(或沒有其它結(jié)果): ((stmt.getResultSet() == null) && (stmt.getUpdateCount() == -1)) 如果已經(jīng)調(diào)用方法 getResultSet 并處理了它返回的 ResultSet 對象,則有必要調(diào)用方法 getMoreResults 以確定是否有其它結(jié)果集或更新計數(shù)。如果 getMoreResults 返回 true,則需要再次調(diào)用 getResultSet 來檢索下一個結(jié)果集。如上所述,如果 getResultSet 返回 null,則需要調(diào)用 getUpdateCount 來檢查 null 是表示結(jié)果為更新計數(shù)還是表示沒有其它結(jié)果。 當(dāng) getMoreResults 返回 false 時,它表示該 SQL 語句返回一個更新計數(shù)或沒有其它結(jié)果。因此需要調(diào)用方法 getUpdateCount 來檢查它是哪一種情況。在這種情況下,當(dāng)下列條件為真時表示沒有其它結(jié)果: ((stmt.getMoreResults() == false) && (stmt.getUpdateCount() == -1)) 下面的代碼演示了一種方法用來確認(rèn)已訪問調(diào)用方法 execute 所產(chǎn)生的全部結(jié)果集和更新計數(shù): stmt.execute(queryStringWithUnknownResults); while (true) { int rowCount = stmt.getUpdateCount(); if (rowCount > 0) { // 它是更新計數(shù) 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; } // 執(zhí)行到這里,證明有一個結(jié)果集 // 或沒有其它結(jié)果 ResultSet rs = stmt.getResultSet; if (rs != null) { . . . // 使用元數(shù)據(jù)獲得關(guān)于結(jié)果集列的信息 while (rs.next()) { . . . // 處理結(jié)果 stmt.getMoreResults(); continue; } break; // 沒有其它結(jié)果
面試題相關(guān)文章: