JDBCTM中Statement接口提供的execute、executeQuery和executeUpdate之間的區(qū)別
Statement 接口提供了三種執(zhí)行 SQL 語(yǔ)句的方法:executeQueryexecuteUpdate 和 execute吮播。使用哪一個(gè)方法由 SQL 語(yǔ)句所產(chǎn)生的內(nèi)容決定说贝。
方法executeQuery
用于產(chǎn)生單個(gè)結(jié)果集的語(yǔ)句,例如 SELECT 語(yǔ)句践惑。 被使用最多的執(zhí)行 SQL 語(yǔ)句的方法是 executeQuery腹泌。這個(gè)方法被用來(lái)執(zhí)行 SELECT 語(yǔ)句,它幾乎是使用最多的 SQL 語(yǔ)句尔觉。
方法executeUpdat:
** 用于執(zhí)行 INSERT凉袱、UPDATE 或 DELETE 語(yǔ)句以及 SQL DDL(數(shù)據(jù)定義語(yǔ)言)語(yǔ)句,例如 CREATE TABLE 和 DROP TABLE侦铜。INSERT专甩、UPDATE 或 DELETE 語(yǔ)句的效果是修改表中零行或多行中的一列或多列。**executeUpdate 的返回值是一個(gè)整數(shù)钉稍,指示受影響的行數(shù)(即更新計(jì)數(shù))涤躲。對(duì)于 CREATE TABLE 或 DROP TABLE 等不操作行的語(yǔ)句,executeUpdate 的返回值總為零。 使用executeUpdate方法是因?yàn)樵?createTableCoffees 中的 SQL 語(yǔ)句是 DDL (數(shù)據(jù)定義語(yǔ)言)語(yǔ)句。創(chuàng)建表肋僧,改變表,刪除表都是 DDL 語(yǔ)句的例子缸托,要用 executeUpdate 方法來(lái)執(zhí)行。你也可以從它的名字里看出瘾蛋,方法 executeUpdate 也被用于執(zhí)行更新表 SQL 語(yǔ)句俐镐。實(shí)際上,相對(duì)于創(chuàng)建表來(lái)說(shuō)哺哼,executeUpdate 用于更新表的時(shí)間更多佩抹,因?yàn)楸碇恍枰獎(jiǎng)?chuàng)建一次叼风,但經(jīng)常被更新。
方法execute:
用于執(zhí)行返回多個(gè)結(jié)果集棍苹、多個(gè)更新計(jì)數(shù)或二者組合的語(yǔ)句无宿。因?yàn)槎鄶?shù)程序員不會(huì)需要該高級(jí)功能.
execute方法應(yīng)該僅在語(yǔ)句能返回多個(gè)ResultSet對(duì)象、多個(gè)更新計(jì)數(shù)或ResultSet對(duì)象與更新計(jì)數(shù)的組合時(shí)使用枢里。當(dāng)執(zhí)行某個(gè)已存儲(chǔ)過(guò)程或動(dòng)態(tài)執(zhí)行未知 SQL 字符串(即應(yīng)用程序程序員在編譯時(shí)未知)時(shí)孽鸡,有可能出現(xiàn)多個(gè)結(jié)果的情況,盡管這種情況很少見(jiàn)栏豺。
因?yàn)榉椒?execute 處理非常規(guī)情況彬碱,所以獲取其結(jié)果需要一些特殊處理并不足為怪。例如奥洼,假定已知某個(gè)過(guò)程返回兩個(gè)結(jié)果集巷疼,則在使用方法 execute 執(zhí)行該過(guò)程后,必須調(diào)用方法 getResultSet 獲得第一個(gè)結(jié)果集灵奖,然后調(diào)用適當(dāng)?shù)?getXXX 方法獲取其中的值嚼沿。要獲得第二個(gè)結(jié)果集,需要先調(diào)用 getMoreResults 方法瓷患,然后再調(diào)用 getResultSet 方法骡尽。如果已知某個(gè)過(guò)程返回兩個(gè)更新計(jì)數(shù),則首先調(diào)用方法 getUpdateCount尉尾,然后調(diào)用 getMoreResults爆阶,并再次調(diào)用 getUpdateCount燥透。
對(duì)于不知道返回內(nèi)容沙咏,則情況更為復(fù)雜。如果結(jié)果是 ResultSet 對(duì)象班套,則方法 execute 返回 true肢藐;如果結(jié)果是 Java int,則返回 false吱韭。如果返回 int吆豹,則意味著結(jié)果是更新計(jì)數(shù)或執(zhí)行的語(yǔ)句是 DDL 命令。在調(diào)用方法 execute 之后要做的第一件事情是調(diào)用 getResultSet 或 getUpdateCount理盆。調(diào)用方法 getResultSet 可以獲得兩個(gè)或多個(gè) ResultSet 對(duì)象中第一個(gè)對(duì)象痘煤;或調(diào)用方法 getUpdateCount 可以獲得兩個(gè)或多個(gè)更新計(jì)數(shù)中第一個(gè)更新計(jì)數(shù)的內(nèi)容。
*當(dāng) SQL 語(yǔ)句的結(jié)果不是結(jié)果集時(shí)猿规,則方法 getResultSet 將返回 null衷快。這可能意味著結(jié)果是一個(gè)更新計(jì)數(shù)或沒(méi)有其它結(jié)果。在這種情況下姨俩,判斷 null 真正含義的唯一方法是調(diào)用方法 getUpdateCount蘸拔,它將返回一個(gè)整數(shù)师郑。這個(gè)整數(shù)為調(diào)用語(yǔ)句所影響的行數(shù);如果為 -1 則表示結(jié)果是結(jié)果集或沒(méi)有結(jié)果调窍。如果方法 getResultSet 已返回 null(表示結(jié)果不是 ResultSet 對(duì)象)宝冕,則返回值 -1 表示沒(méi)有其它結(jié)果。也就是說(shuō)邓萨,當(dāng)下列條件為真時(shí)表示沒(méi)有結(jié)果(或沒(méi)有其它結(jié)果):
((stmt.getResultSet() == null) && (stmt.getUpdateCount() == -1))
如果已經(jīng)調(diào)用方法 getResultSet 并處理了它返回的 ResultSet 對(duì)象地梨,則有必要調(diào)用方法 getMoreResults 以確定是否有其它結(jié)果集或更新計(jì)數(shù)。如果 getMoreResults 返回 true缔恳,則需要再次調(diào)用 getResultSet 來(lái)檢索下一個(gè)結(jié)果集湿刽。如上所述,如果 getResultSet 返回 null褐耳,則需要調(diào)用 getUpdateCount 來(lái)檢查 null 是表示結(jié)果為更新計(jì)數(shù)還是表示沒(méi)有其它結(jié)果诈闺。
當(dāng) getMoreResults 返回 false 時(shí),它表示該 SQL 語(yǔ)句返回一個(gè)更新計(jì)數(shù)或沒(méi)有其它結(jié)果铃芦。因此需要調(diào)用方法 getUpdateCount 來(lái)檢查它是哪一種情況雅镊。在這種情況下,當(dāng)下列條件為真時(shí)表示沒(méi)有其它結(jié)果:
((stmt.getMoreResults() == false) && (stmt.getUpdateCount() == -1))
下面的代碼演示了一種方法用來(lái)確認(rèn)已訪問(wèn)調(diào)用方法 execute 所產(chǎn)生的全部結(jié)果集和更新計(jì)數(shù):
while (true) {
int rowCount = stmt.getUpdateCount();
if (rowCount > 0) { // 它是更新計(jì)數(shù)
System.out.println("Rows changed = " + count);
stmt.getMoreResults();
continue;
}
if (rowCount == 0) { // DDL 命令或 0 個(gè)更新
System.out.println(" No rows changed or statement was DDL
command");
stmt.getMoreResults();
continue;
}
// 執(zhí)行到這里刃滓,證明有一個(gè)結(jié)果集
// 或沒(méi)有其它結(jié)果
ResultSet rs = stmt.getResultSet;
if (rs != null) {
. . . // 使用元數(shù)據(jù)獲得關(guān)于結(jié)果集列的信息
while (rs.next()) {
. . . // 處理結(jié)果
stmt.getMoreResults();
continue;
}
break; // 沒(méi)有其它結(jié)果```