狠狠爱成人网_日韩一级在线_国产综合自拍_亚洲精品韩国_亚洲视频导航_麻豆成人在线播放_欧美jjzz_一区在线视频观看_美脚丝袜一区二区三区在线观看_欧美91视频

當(dāng)前位置:系統(tǒng)之家 > 技術(shù)開發(fā)教程 > 詳細(xì)頁面

JDBCTM 向?qū)В夯A(chǔ)4 - Statement

JDBCTM 向?qū)В夯A(chǔ)4 - Statement

更新時(shí)間:2019-08-23 文章作者:未知 信息來源:網(wǎng)絡(luò) 閱讀次數(shù):

4 - Statement
本概述是從《JDBCTM Database Access from JavaTM: A Tutorial and Annotated Reference 》這本書中摘引來的。JavaSoft 目前正在準(zhǔn)備這本書。這是一本教程,同時(shí)也是 JDBC 的重要參考手冊,它將作為 Java 系列的組成部份在 1997 年春季由 Addison-Wesley 出版公司出版。


4.1 概述
Statement 對象用于將 SQL 語句發(fā)送到數(shù)據(jù)庫中。實(shí)際上有三種 Statement 對象,它們都作為在給定連接上執(zhí)行 SQL 語句的包容器:Statement、PreparedStatement(它從 Statement 繼承而來)和 CallableStatement(它從 PreparedStatement 繼承而來)。它們都專用于發(fā)送特定類型的 SQL 語句: Statement 對象用于執(zhí)行不帶參數(shù)的簡單 SQL 語句;PreparedStatement 對象用于執(zhí)行帶或不帶 IN 參數(shù)的預(yù)編譯 SQL 語句;CallableStatement 對象用于執(zhí)行對數(shù)據(jù)庫已存儲過程的調(diào)用。

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


4.1.1 創(chuàng)建 Statement 對象
建立了到特定數(shù)據(jù)庫的連接之后,就可用該連接發(fā)送 SQL 語句。Statement 對象用 Connection 的方法 createStatement 創(chuàng)建,如下列代碼段中所示:

Connection con = DriverManager.getConnection(url, "sunny", "");
Statement stmt = con.createStatement();

為了執(zhí)行 Statement 對象,被發(fā)送到數(shù)據(jù)庫的 SQL 語句將被作為參數(shù)提供給 Statement 的方法:

ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table2");

4.1.2 使用 Statement 對象執(zhí)行語句
Statement 接口提供了三種執(zhí)行 SQL 語句的方法:executeQuery、executeUpdate 和 execute。使用哪一個方法由 SQL 語句所產(chǎn)生的內(nèi)容決定。

方法 executeQuery 用于產(chǎn)生單個結(jié)果集的語句,例如 SELECT 語句。

方法 executeUpdate 用于執(zhí)行 INSERT、UPDATE 或 DELETE 語句以及 SQL DDL(數(shù)據(jù)定義語言)語句,例如 CREATE TABLE 和 DROP TABLE。INSERT、UPDATE 或 DELETE 語句的效果是修改表中零行或多行中的一列或多列。executeUpdate 的返回值是一個整數(shù),指示受影響的行數(shù)(即更新計(jì)數(shù))。對于 CREATE TABLE 或 DROP TABLE 等不操作行的語句,executeUpdate 的返回值總為零。

方法 execute 用于執(zhí)行返回多個結(jié)果集、多個更新計(jì)數(shù)或二者組合的語句。因?yàn)槎鄶?shù)程序員不會需要該高級功能,所以本概述后面將在單獨(dú)一節(jié)中對其進(jìn)行介紹。

執(zhí)行語句的所有方法都將關(guān)閉所調(diào)用的 Statement 對象的當(dāng)前打開結(jié)果集(如果存在)。這意味著在重新執(zhí)行 Statement 對象之前,需要完成對當(dāng)前 ResultSet 對象的處理。

應(yīng)注意,繼承了 Statement 接口中所有方法的 PreparedStatement 接口都有自己的 executeQuery、executeUpdate 和 execute 方法。Statement 對象本身不包含 SQL 語句,因而必須給 Statement.execute 方法提供 SQL 語句作為參數(shù)。PreparedStatement 對象并不將 SQL 語句作為參數(shù)提供給這些方法,因?yàn)樗鼈円呀?jīng)包含預(yù)編譯 SQL 語句。CallableStatement 對象繼承這些方法的 PreparedStatement 形式。對于這些方法的 PreparedStatement 或 CallableStatement 版本,使用查詢參數(shù)將拋出 SQLException。


4.1.3 語句完成
當(dāng)連接處于自動提交模式時(shí),其中所執(zhí)行的語句在完成時(shí)將自動提交或還原。語句在已執(zhí)行且所有結(jié)果返回時(shí),即認(rèn)為已完成。對于返回一個結(jié)果集的 executeQuery 方法,在檢索完 ResultSet 對象的所有行時(shí)該語句完成。對于方法 executeUpdate,當(dāng)它執(zhí)行時(shí)語句即完成。但在少數(shù)調(diào)用方法 execute 的情況中,在檢索所有結(jié)果集或它生成的更新計(jì)數(shù)之后語句才完成。

有些 DBMS 將已存儲過程中的每條語句視為獨(dú)立的語句;而另外一些則將整個過程視為一個復(fù)合語句。在啟用自動提交時(shí),這種差別就變得非常重要,因?yàn)樗绊懯裁磿r(shí)候調(diào)用 commit 方法。在前一種情況中,每條語句單獨(dú)提交;在后一種情況中,所有語句同時(shí)提交。


4.1.4 關(guān)閉 Statement 對象
Statement 對象將由 Java 垃圾收集程序自動關(guān)閉。而作為一種好的編程風(fēng)格,應(yīng)在不需要 Statement 對象時(shí)顯式地關(guān)閉它們。這將立即釋放 DBMS 資源,有助于避免潛在的內(nèi)存問題。


4.1.5 Statement 對象中的 SQL 轉(zhuǎn)義語法
Statement 可包含使用 SQL 轉(zhuǎn)義語法的 SQL 語句。轉(zhuǎn)義語法告訴驅(qū)動程序其中的代碼應(yīng)該以不同方式處理。驅(qū)動程序?qū)呙枞魏无D(zhuǎn)義語法,并將它轉(zhuǎn)換成特定數(shù)據(jù)庫可理解的代碼。這使得轉(zhuǎn)義語法與 DBMS 無關(guān),并允許程序員使用在沒有轉(zhuǎn)義語法時(shí)不可用的功能。

轉(zhuǎn)義子句由花括號和關(guān)鍵字界定:

{keyword . . . parameters . . . }

該關(guān)鍵字指示轉(zhuǎn)義子句的類型,如下所示。


escape 表示 LIKE 轉(zhuǎn)義字符


字符“%”和“_”類似于 SQL LIKE 子句中的通配符(“%”匹配零個或多個字符,而“_”則匹配一個字符)。為了正確解釋它們,應(yīng)在其前面加上反斜杠(“\”),它是字符串中的特殊轉(zhuǎn)義字符。在查詢末尾包括如下語法即可指定用作轉(zhuǎn)義字符的字符:

{escape 'escape-character'}


例如,下列查詢使用反斜杠字符作為轉(zhuǎn)義字符,查找以下劃線開頭的標(biāo)識符名:

stmt.executeQuery("SELECT name FROM Identifiers
WHERE Id LIKE `\_%' {escape `\'};


fn 表示標(biāo)量函數(shù)


幾乎所有 DBMS 都具有標(biāo)量值的數(shù)值、字符串、時(shí)間、日期、系統(tǒng)和轉(zhuǎn)換函數(shù)。要使用這些函數(shù),可使用如下轉(zhuǎn)義語法:關(guān)鍵字 fn 后跟所需的函數(shù)名及其參數(shù)。例如,下列代碼調(diào)用函數(shù) concat 將兩個參數(shù)連接在一起:

{fn concat("Hot", "Java")};


可用下列語法獲得當(dāng)前數(shù)據(jù)庫用戶名:

{fn user()};


標(biāo)量函數(shù)可能由語法稍有不同的 DBMS 支持,而它們可能不被所有驅(qū)動程序支持。各種 DatabaseMetaData 方法將列出所支持的函數(shù)。例如,方法 getNumericFunctions 返回用逗號分隔的數(shù)值函數(shù)列表,而方法 getStringFunctions 將返回字符串函數(shù),等等。

驅(qū)動程序?qū)⑥D(zhuǎn)義函數(shù)調(diào)用映射為相應(yīng)的語法,或直接實(shí)現(xiàn)該函數(shù)。


d、t 和 ts 表示日期和時(shí)間文字


DBMS 用于日期、時(shí)間和時(shí)間標(biāo)記文字的語法各不相同。JDBC 使用轉(zhuǎn)義子句支持這些文字的語法的 ISO 標(biāo)準(zhǔn)格式。驅(qū)動程序必須將轉(zhuǎn)義子句轉(zhuǎn)換成 DBMS 表示。

例如,可用下列語法在 JDBC SQL 語句中指定日期:

{d `yyyy-mm-dd'}


在該語法中,yyyy 為年代,mm 為月份,而 dd 則為日期。驅(qū)動程序?qū)⒂玫葍r(jià)的特定于 DBMS 的表示替換這個轉(zhuǎn)義子句。例如,如果 '28- FEB-99' 符合基本數(shù)據(jù)庫的格式,則驅(qū)動程序?qū)⒂盟鎿Q {d 1999-02-28}。

對于 TIME 和 TIMESTAMP 也有類似的轉(zhuǎn)義子句:

{t `hh:mm:ss'}
{ts `yyyy-mm-dd hh:mm:ss.f . . .'}


TIMESTAMP 中的小數(shù)點(diǎn)后的秒(.f . . .)部分可忽略。


call 或 ? = call 表示已存儲過程



如果數(shù)據(jù)庫支持已存儲過程,則可從 JDBC 中調(diào)用它們,語法為:

{call procedure_name[(?, ?, . . .)]}


或(其中過程返回結(jié)果參數(shù)):

{? = call procedure_name[(?, ?, . . .)]}


方括號指示其中的內(nèi)容是可選的。它們不是語法的必要部分。

輸入?yún)?shù)可以為文字或參數(shù)。有關(guān)詳細(xì)信息,參見 JDBC 指南中第 7 節(jié),“CallableStatement”。

可通過調(diào)用方法 DatabaseMetaData.supportsStoredProcedures 檢查數(shù)據(jù)庫是否支持已存儲過程。



oj 表示外部連接



外部連接的語法為

{oj outer-join}


其中 outer-join 形式為

table LEFT OUTER JOIN {table / outer-join} ON search-condition


外部連接屬于高級功能。有關(guān)它們的解釋可參見 SQL 語法。JDBC 提供了三種 DatabaseMetaData 方法用于確定驅(qū)動程序支持哪些外部連接類型:supportsOuterJoins、supportsFullOuterJoins 和 supportsLimitedOuterJoins。


方法 Statement.setEscapeProcessing 可打開或關(guān)閉轉(zhuǎn)義處理;缺省狀態(tài)為打開。當(dāng)性能極為重要時(shí),程序員可能想關(guān)閉它以減少處理時(shí)間。但通常它將出于打開狀態(tài)。應(yīng)注意: setEscapeProcessing 不適用于 PreparedStatement 對象,因?yàn)樵谡{(diào)用該語句前它就可能已被發(fā)送到數(shù)據(jù)庫。有關(guān)預(yù)編譯的信息,參見 PreparedStatement。


4.1.6 使用方法 execute
execute 方法應(yīng)該僅在語句能返回多個 ResultSet 對象、多個更新計(jì)數(shù)或 ResultSet 對象與更新計(jì)數(shù)的組合時(shí)使用。當(dāng)執(zhí)行某個已存儲過程或動態(tài)執(zhí)行未知 SQL 字符串(即應(yīng)用程序程序員在編譯時(shí)未知)時(shí),有可能出現(xiàn)多個結(jié)果的情況,盡管這種情況很少見。例如,用戶可能執(zhí)行一個已存儲過程(使用 CallableStatement 對象 - 參見第 135 頁的 CallableStatement),并且該已存儲過程可執(zhí)行更新,然后執(zhí)行選擇,再進(jìn)行更新,再進(jìn)行選擇,等等。通常使用已存儲過程的人應(yīng)知道它所返回的內(nèi)容。

因?yàn)榉椒?execute 處理非常規(guī)情況,所以獲取其結(jié)果需要一些特殊處理并不足為怪。例如,假定已知某個過程返回兩個結(jié)果集,則在使用方法 execute 執(zhí)行該過程后,必須調(diào)用方法 getResultSet 獲得第一個結(jié)果集,然后調(diào)用適當(dāng)?shù)?getXXX 方法獲取其中的值。要獲得第二個結(jié)果集,需要先調(diào)用 getMoreResults 方法,然后再調(diào)用 getResultSet 方法。如果已知某個過程返回兩個更新計(jì)數(shù),則首先調(diào)用方法 getUpdateCount,然后調(diào)用 getMoreResults,并再次調(diào)用 getUpdateCount。

對于不知道返回內(nèi)容,則情況更為復(fù)雜。如果結(jié)果是 ResultSet 對象,則方法 execute 返回 true;如果結(jié)果是 Java int,則返回 false。如果返回 int,則意味著結(jié)果是更新計(jì)數(shù)或執(zhí)行的語句是 DDL 命令。在調(diào)用方法 execute 之后要做的第一件事情是調(diào)用 getResultSet 或 getUpdateCount。調(diào)用方法 getResultSet 可以獲得兩個或多個 ResultSet 對象中第一個對象;或調(diào)用方法 getUpdateCount 可以獲得兩個或多個更新計(jì)數(shù)中第一個更新計(jì)數(shù)的內(nèi)容。

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

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

如果已經(jīng)調(diào)用方法 getResultSet 并處理了它返回的 ResultSet 對象,則有必要調(diào)用方法 getMoreResults 以確定是否有其它結(jié)果集或更新計(jì)數(shù)。如果 getMoreResults 返回 true,則需要再次調(diào)用 getResultSet 來檢索下一個結(jié)果集。如上所述,如果 getResultSet 返回 null,則需要調(diào)用 getUpdateCount 來檢查 null 是表示結(jié)果為更新計(jì)數(shù)還是表示沒有其它結(jié)果。

當(dāng) getMoreResults 返回 false 時(shí),它表示該 SQL 語句返回一個更新計(jì)數(shù)或沒有其它結(jié)果。因此需要調(diào)用方法 getUpdateCount 來檢查它是哪一種情況。在這種情況下,當(dāng)下列條件為真時(shí)表示沒有其它結(jié)果:

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

下面的代碼演示了一種方法用來確認(rèn)已訪問調(diào)用方法 execute 所產(chǎn)生的全部結(jié)果集和更新計(jì)數(shù):


stmt.execute(queryStringWithUnknownResults);
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 個更新
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é)果



溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統(tǒng)下載排行

狠狠爱成人网_日韩一级在线_国产综合自拍_亚洲精品韩国_亚洲视频导航_麻豆成人在线播放_欧美jjzz_一区在线视频观看_美脚丝袜一区二区三区在线观看_欧美91视频
亚洲精品美腿丝袜| 色婷婷综合久久久久中文 | 欧美一卡二卡在线| 9人人澡人人爽人人精品| 欧美日韩国产影片| 美女视频第一区二区三区免费观看网站| 欧美成人vr18sexvr| 国内欧美视频一区二区| 91一区二区在线| 国产精品三级在线观看| 国产精品久久| 亚洲乱码中文字幕| 国产亚洲精品bv在线观看| 亚洲bt欧美bt精品777| 国产99精品视频| 久久久久久久综合日本| 韩日视频一区| 石原莉奈一区二区三区在线观看| 欧美在线你懂得| 99精品欧美一区二区蜜桃免费| 国产精品伦一区二区三级视频| 国产一区二区黄色| 成人精品小蝌蚪| 亚洲另类一区二区| 欧美久久久久久久久久| 女人香蕉久久**毛片精品| 亚洲欧美日本韩国| 69久久99精品久久久久婷婷 | 男人的天堂久久精品| 91精品国产欧美日韩| 亚洲激情在线| 国产精品99久久久久久似苏梦涵| 国产色一区二区| 欧美网站一区二区| 亚洲电影成人| 国产91精品在线观看| 一区二区三区小说| 久久久综合激的五月天| 欧美亚州韩日在线看免费版国语版| 91麻豆成人久久精品二区三区| 日韩在线一区二区| 亚洲三级电影全部在线观看高清| 欧美精品一二三四| 久久国产精品亚洲77777| 成人精品亚洲人成在线| 麻豆精品在线播放| 亚洲一区二区在线观看视频| 国产人久久人人人人爽| 日韩视频一区二区在线观看| 国产免费成人在线视频| 亚洲国产激情| 亚洲一区三区电影在线观看| 欧美午夜视频| 欧美成人在线免费观看| 国产99久久久国产精品潘金网站| 日本美女一区二区三区| 亚洲地区一二三色| 亚洲综合色视频| 欧美精品 国产精品| 国产精品国产三级国产普通话蜜臀 | 久久av老司机精品网站导航| 欧美亚洲不卡| 91精品国产黑色紧身裤美女| 国产精品久久久久久久裸模| 久久成人麻豆午夜电影| 暖暖成人免费视频| 欧美日韩亚洲不卡| 亚洲精品国产无天堂网2021 | 久久精品网址| 欧美国产1区2区| 丁香啪啪综合成人亚洲小说 | 欧美久久一区二区| 亚洲精品第一国产综合野| 粉嫩av一区二区三区| 欧美综合色免费| 亚洲一区在线看| 一区二区三区|亚洲午夜| 国产亚洲综合av| 成人av在线播放网站| 欧美高清精品3d| 黄网站免费久久| 一本一道综合狠狠老| 亚洲午夜日本在线观看| 日韩一级大片| 亚洲线精品一区二区三区八戒| 在线观看成人av| 亚洲色图色小说| 99在线观看免费视频精品观看| 中文字幕一区二区三区精华液| 欧美日韩国产一区精品一区| 欧美极品美女视频| 亚洲视频精品| 亚洲v精品v日韩v欧美v专区| 奶水喷射视频一区| 蓝色福利精品导航| 91精品国产乱码| 成人小视频免费观看| 久久精品网站免费观看| 91看片淫黄大片一级在线观看| 国产精品入口麻豆九色| 伊大人香蕉综合8在线视| 亚洲综合一区二区精品导航| 日韩图片一区| 免费在线欧美黄色| 国产在线精品一区二区| 日韩你懂的电影在线观看| av在线一区二区| 国产精品初高中害羞小美女文| 国产一区免费视频| 蜜臀av一区二区在线观看| 精品国产制服丝袜高跟| 99热这里只有成人精品国产| 爽好久久久欧美精品| 欧美一区二区三区影视| 在线精品一区| 国产电影一区在线| 亚洲综合无码一区二区| 91.xcao| 日韩一级网站| 成人自拍视频在线观看| 亚洲美腿欧美偷拍| 欧美亚洲综合色| 最新亚洲一区| 99re这里只有精品首页| 美脚の诱脚舐め脚责91| 亚洲国产精华液网站w| 欧美男生操女生| 国产精品一区毛片| 成人h精品动漫一区二区三区| 亚洲丶国产丶欧美一区二区三区| 精品国产免费久久| 欧美日韩国产免费一区二区| 一本不卡影院| 午夜精品一区二区三区四区 | 国产精品成人午夜| 久久久久久夜精品精品免费| 欧美无砖砖区免费| 久久久综合网| 久久另类ts人妖一区二区| 欧美日韩综合精品| 色综合天天综合网天天狠天天| 国产一区二区精品久久99| 日本一道高清亚洲日美韩| 综合欧美一区二区三区| 欧美国产日本韩| 欧美激情一二三区| 久久久综合精品| 亚洲精品在线观| 精品处破学生在线二十三| 国产精品无码永久免费888| 日韩免费高清电影| 精品久久久久久无| 国产亚洲成av人在线观看导航| 91精品国产免费久久综合| 日韩片之四级片| 成人一道本在线| 欧美精品成人| 欧美成人一品| 国产精品久久久久久模特 | 久久狠狠婷婷| 国产亚洲在线| 国产欧美视频一区二区| 91精品国产一区二区人妖| 免费看日韩精品| 久久久一区二区三区| ㊣最新国产の精品bt伙计久久| 一区二区三区在线播| 日韩激情av在线| 国产在线精品免费| 99精品视频中文字幕| 黄色另类av| 久久精品国产清高在天天线 | 伊人天天综合| 日本精品免费观看高清观看| 在线播放91灌醉迷j高跟美女| 26uuu国产电影一区二区| 亚洲欧美一区二区三区久本道91| 亚洲自拍偷拍图区| 国产中文一区二区三区| 欧美精品一区在线| 日本丶国产丶欧美色综合| 日韩欧美一二区| 亚洲自拍另类综合| 成人高清在线视频| 国产九九精品| 精品国产乱码久久久久久浪潮| 日韩一区在线免费观看| 久久国产剧场电影| 亚洲黄色av| 日韩视频国产视频| 午夜成人免费电影| 91理论电影在线观看| 欧美日韩卡一卡二| 久久成人资源| 亚洲成人在线视频网站| 欧美一区二区观看视频| 香蕉久久一区二区不卡无毒影院| 91视频91自| 欧美伊人精品成人久久综合97| 一区二区三区在线高清|