關(guān)于execute囚戚、executeQuery和executeUpdate之間的區(qū)別

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é)果```
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末仁烹,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子咧虎,更是在濱河造成了極大的恐慌卓缰,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件砰诵,死亡現(xiàn)場(chǎng)離奇詭異征唬,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)茁彭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門总寒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人理肺,你說(shuō)我怎么就攤上這事摄闸。” “怎么了妹萨?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵年枕,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我乎完,道長(zhǎng)熏兄,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮霍弹,結(jié)果婚禮上毫别,老公的妹妹穿的比我還像新娘。我一直安慰自己典格,他們只是感情好岛宦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著耍缴,像睡著了一般砾肺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上防嗡,一...
    開(kāi)封第一講書(shū)人閱讀 51,573評(píng)論 1 305
  • 那天变汪,我揣著相機(jī)與錄音,去河邊找鬼蚁趁。 笑死裙盾,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的他嫡。 我是一名探鬼主播番官,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼钢属!你這毒婦竟也來(lái)了徘熔?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤淆党,失蹤者是張志新(化名)和其女友劉穎酷师,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體染乌,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡山孔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了慕匠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片饱须。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖台谊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情譬挚,我是刑警寧澤锅铅,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站减宣,受9級(jí)特大地震影響盐须,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜漆腌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一贼邓、第九天 我趴在偏房一處隱蔽的房頂上張望阶冈。 院中可真熱鬧,春花似錦塑径、人聲如沸女坑。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)匆骗。三九已至,卻和暖如春誉简,著一層夾襖步出監(jiān)牢的瞬間碉就,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工闷串, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瓮钥,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓烹吵,卻偏偏與公主長(zhǎng)得像骏庸,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子年叮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容