偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

淺談標(biāo)準(zhǔn)SQL數(shù)據(jù)庫(kù)訪問界面—JDBC API

開發(fā) 后端
隨著Java語(yǔ)言應(yīng)用面的逐步拓寬,Sun Microsystems 公司開發(fā)了一個(gè)標(biāo)準(zhǔn)的SQL數(shù)據(jù)庫(kù)訪問界面——JDBC API。它可以使Java編程人員通過一個(gè)一致的界面,訪問多種關(guān)系數(shù)據(jù)庫(kù)。

JDBC API定義了一系列Java類,用來表示數(shù)據(jù)庫(kù)連接、SQL語(yǔ)句、結(jié)果集、數(shù)據(jù)庫(kù)元數(shù)據(jù)等,能夠使Java編程人員發(fā)送SQL語(yǔ)句和處理返回結(jié)果。 JDBC API由一個(gè)驅(qū)動(dòng)程序管理器實(shí)現(xiàn)對(duì)連接到不同數(shù)據(jù)庫(kù)的多個(gè)驅(qū)動(dòng)程序的管理。JDBC驅(qū)動(dòng)程序可以全部由Java語(yǔ)言編寫,也可以由本地化方法來實(shí)現(xiàn)與現(xiàn)有數(shù)據(jù)庫(kù)訪問接口的連接。

一、總體結(jié)構(gòu) Java應(yīng)用程序通過JDBC API界面訪問JDBC管理器,JDBC管理器通過JDBC驅(qū)動(dòng)程序API訪問不同的JDBC驅(qū)動(dòng)程序,從而實(shí)現(xiàn)對(duì)不同數(shù)據(jù)庫(kù)的訪問。

1.JDBC API

JDBC API定義了一系列抽象Java界面,可以使應(yīng)用程序員連接到指定的數(shù)據(jù)庫(kù),執(zhí)行SQL語(yǔ)句和處理返回結(jié)果。其功能結(jié)構(gòu)如圖2所示。 @@I2;圖2 JDBC API主要功能結(jié)構(gòu)@@ JDBC API中重要的界面有: java.sgl.DriverManager:完成驅(qū)動(dòng)程序的裝載和建立新的數(shù)據(jù)庫(kù)連接。 java.sgl.Connection:表示對(duì)某一指定數(shù)據(jù)庫(kù)的連接。 java.sgl.Statement:管理在一指定數(shù)據(jù)庫(kù)連接上的SQL語(yǔ)句的執(zhí)行。 java.sgl.ResultSet:訪問一指定語(yǔ)句的原始結(jié)果。 java.sgl.Statement:界面有兩個(gè)重要的子類型:ja-va.sgl.PreparedStatement (用于對(duì)預(yù)編譯的SQL語(yǔ)句的執(zhí)行)和java.sgl.CallableStatement(用于對(duì)一個(gè)數(shù)據(jù)庫(kù)存儲(chǔ)過程的執(zhí)行)。

2. JDBC驅(qū)動(dòng)程序界面

數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序中必須實(shí)現(xiàn)在JDBC API中定義的抽象類,尤其是對(duì)java.sgl.Connection、java.sgl.Prepared-Statement、java.sgl.CallableStatement和java.sgl.Re-sultSet的實(shí)現(xiàn)。此外,每一個(gè)數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序必須提供一個(gè)類實(shí)現(xiàn) java.sgl.Driver界面,用于通用的java.sgl.DriverManager類,使其在對(duì)一個(gè)指定的數(shù)據(jù)庫(kù)URL訪問時(shí)可以查找相應(yīng)的驅(qū)動(dòng)程序。 Sun Microsystems公司提供了一個(gè)JDBC對(duì)ODBC的連接橋,如圖1中 JDBC-ODBC橋接驅(qū)動(dòng)程序所示。由于是建立在ODBC基礎(chǔ)之上,所以具有規(guī)模較小而效率高的特點(diǎn)。

3.用戶典型使用模式

(1)Applet模式 使用Java語(yǔ)言編制 Applet,作為 WWW文檔的一部分在Internet上發(fā)布,由瀏覽器對(duì)其下載,并運(yùn)行。其中,可能會(huì)有部分Applet需要訪問數(shù)據(jù)庫(kù),則可通過使用JDBC API實(shí)現(xiàn),由于未信任的Applet不能訪問本地文件和對(duì)任意主機(jī)建立網(wǎng)絡(luò)連接,JDBC必須遵守標(biāo)準(zhǔn)Applet的安全模型,所以此種應(yīng)用模式有諸多安全方面的限制。對(duì)信任的Applet,其安全模型類似于Java應(yīng)用程序。

(2)應(yīng)用程序模式 在應(yīng)用程序中,Java代碼是信任的,因而可以讀寫本地文件和建立網(wǎng)絡(luò)連接。應(yīng)用示意如圖4所示。 @@I4;圖4 應(yīng)用程序應(yīng)用模式@@ 此種應(yīng)用模式非常適合intranet(內(nèi)部網(wǎng))應(yīng)用。當(dāng)然該模式也能夠通過Internet訪問數(shù)據(jù)庫(kù)。 二、JDBC API 1.JDBC界面定義 JDBC API包含java.sgl的界面和類。 java.sgl.CallableStatement:用于執(zhí)行存儲(chǔ)的SQL過程的界面。 java.sgl.Connection: 一個(gè)連接表示與某一指定數(shù)據(jù)庫(kù)的一個(gè)會(huì)話。在該連接中可以執(zhí)行SQL語(yǔ)句和處理返回結(jié)果。 java.sql.DataTruncation:當(dāng)JDBC碰到意外數(shù)據(jù)截?cái)鄷r(shí),報(bào)告一個(gè)警告(讀數(shù)據(jù)時(shí))或產(chǎn)生一個(gè)異常(寫數(shù)據(jù)時(shí))。 java.sql.Date:是標(biāo)準(zhǔn)java.util.date的一個(gè)子集,只表示天數(shù),而不包含時(shí)、分、秒。 java.sql.Driver:定義一個(gè)在每一個(gè)數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序中必須實(shí)現(xiàn)的驅(qū)動(dòng)程序界面。 java.sql.DriverManager:提供對(duì)全局SQL狀態(tài)的訪問。 java.sql.DriverPropertyInto:提供高級(jí)程序員與驅(qū)動(dòng)程序之間對(duì)連接特性信息進(jìn)行交互的手段。 java.sql.NullData:當(dāng)由getXXX或getObiect方法讀出一個(gè)SQL空值時(shí),產(chǎn)生一個(gè)NullData警告。 java.sql.Numeric:是一個(gè)任意精度標(biāo)量數(shù)值類,可用作表示SQL定點(diǎn)Numerlc和Decimal類型的數(shù)值。 java.sql.PreparedStatement:保存一個(gè)預(yù)編譯的SQL語(yǔ)句的對(duì)象,該對(duì)象可被高效地執(zhí)行多次。 java.sql.ResultSet:結(jié)果集提供對(duì)執(zhí)行一個(gè)SQL語(yǔ)句后產(chǎn)生的結(jié)果表的訪問。表中數(shù)據(jù)按行依次取出。為便于移植,建議對(duì)每一行數(shù)據(jù)從左至右按列讀出。 java.sql.SQLException:處理數(shù)據(jù)庫(kù)訪問時(shí)的出錯(cuò)信息。 java.sql.SQLWarning:處理數(shù)據(jù)庫(kù)訪問時(shí)的警告信息。 java.sql.Statement:用作執(zhí)行一條靜態(tài)的SQL語(yǔ)句并接收產(chǎn)生的結(jié)果。 java.sql.Time:用于表示標(biāo)準(zhǔn)java.util.date類的一個(gè)信息子集,僅表示時(shí)、分、秒。 java.sql.Timestamp:擴(kuò)展標(biāo)準(zhǔn)java.util.date類,使其能夠表示SQL的時(shí)間戳,增加了一個(gè)以納秒為單位的時(shí)間域。 java.sql.Types:定義區(qū)分SQL類型的常量。類常量值與XOPEN中的值相同。 此外,JDBC API 還定義了JDBC元數(shù)據(jù)界面java.sql.DatabaseMetaData 和java.sql.ResultSetMetaData。 @@I5;圖5 界面之間的關(guān)系@@ 界面間的關(guān)系由圖5表示,其中箭頭表示函數(shù),而線表示其它方法。

2.數(shù)據(jù)庫(kù)連接

(1)建立一個(gè)連接 用戶在訪問數(shù)據(jù)庫(kù)時(shí),需要在JD-BC管理層由 java.sql.DriverManager.getConnection方法產(chǎn)生一個(gè)java.sql.Connection對(duì)象。該方法使用一個(gè)數(shù)據(jù)庫(kù)URL串作為參數(shù)。

(2)選擇合適的驅(qū)動(dòng)程序 在數(shù)據(jù)庫(kù)URL中,可以指定驅(qū)動(dòng)程序的名稱,也可以不指定。如果不指定驅(qū)動(dòng)程序,則從Java特性"sql.drivers"所指出的驅(qū)動(dòng)程序表中依次搜尋,使用***找到的可成功連接的驅(qū)動(dòng)程序。

(3)數(shù)據(jù)庫(kù)URL 在連接時(shí),由數(shù)據(jù)庫(kù)URL參數(shù)指定要連接的數(shù)據(jù)庫(kù),此時(shí)可稱為JDBC URL,其格式為: jdbc:<子協(xié)議>:<子名稱> 如果是對(duì)網(wǎng)絡(luò)數(shù)據(jù)庫(kù)訪問,那么建議用戶使用標(biāo)準(zhǔn)URL作為子名稱的一部分。比如對(duì)數(shù)據(jù)資源名為fred訪問的URL可能是: jdbc:odbc:fred 或jdbc:dbnet://wombat:356/fred 子協(xié)議odbc表示對(duì)ODBC數(shù)據(jù)資源的訪問,其格式為: jdbc:odbc:<數(shù)據(jù)資源名>[;<屬性名>=<屬性值>]* ·連接參數(shù):由java.util.Properties對(duì)象指出。建議大多數(shù)參數(shù)不要在此處給出,而在協(xié)議中指出。 ·支持多連接:一個(gè)應(yīng)用程序可以使用一個(gè)或多個(gè)驅(qū)動(dòng)程序建立與多個(gè)數(shù)據(jù)庫(kù)連接。 ·驅(qū)動(dòng)程序的注冊(cè):有兩種方法,一是在JDBC java.sql.DriverManager類初始化時(shí)查找"sql.drivers"特性,對(duì)每一個(gè)驅(qū)動(dòng)程序自動(dòng)注冊(cè);二是由標(biāo)準(zhǔn) Class.forName方法顯式加載一個(gè)驅(qū)動(dòng)程序,參數(shù)為驅(qū)動(dòng)程序名。

3.參數(shù)傳遞和結(jié)果接收

(1)查詢結(jié)果 執(zhí)行一條查詢語(yǔ)句后,返回結(jié)果是可由java.sql.ResultSet對(duì)象訪問的行的集合。在該對(duì)象中提供了一系列"get" 方法,訪問當(dāng)前的每一列,Result-Set.next方法可實(shí)現(xiàn)在結(jié)果集的行之間移動(dòng),可以使用列索引或列名指定相應(yīng)的列。 ·查詢結(jié)果的數(shù)據(jù)轉(zhuǎn)換。 ResultSet.getXXX方法可以把SQL類型轉(zhuǎn)化為需要的Java類型。若指定一個(gè)非法的類型轉(zhuǎn)換時(shí),則產(chǎn)生一個(gè)SQLException的異常。 ·空值判斷。先讀出某一列數(shù)據(jù),然后使用Result-Set.wasNull方法,判斷返回結(jié)果是否是SQL"NULL"。 ·長(zhǎng)數(shù)據(jù)的讀出。JDBC支持由getByte和getString 方法讀出任意長(zhǎng)的LONGVARBINARY或LONGVAR-CHAR類型數(shù)據(jù),也支持由方法GetBinaryStream、GetAsciiStream 和 GetUnicodeStream返回?cái)?shù)據(jù)流來讀出數(shù)據(jù)。 ·支持用getResultSet、GetUpdateCount 和 Get-MoreResults方法分別返回一條結(jié)果、返回被修改的行數(shù)和返回多條結(jié)果。

(2)傳遞IN參數(shù) java.sql.PreparedStatement界面提供了一系列setXXX方法向SQL語(yǔ)句傳遞參數(shù),實(shí)現(xiàn)動(dòng)態(tài)的SQL語(yǔ)句。 在傳遞參數(shù)時(shí)必須滿足數(shù)據(jù)類型一致的要求。因此必須預(yù)先調(diào)用類型轉(zhuǎn)換方法完成數(shù)據(jù)轉(zhuǎn)換,同時(shí)也提供了傳遞SQL空值和長(zhǎng)數(shù)據(jù)給IN參數(shù)的方法。

(3)接收OUT參數(shù) 在調(diào)用一個(gè)存儲(chǔ)過程時(shí),可用setXXX方法傳遞IN參數(shù),使用OUT參數(shù)接收返回結(jié)果。在使用時(shí)必須先調(diào)用CallableStatement.register-OutParameter方法為每一個(gè)OUT參數(shù)進(jìn)行類型注冊(cè),然后執(zhí)行該過程調(diào)用語(yǔ)句,***使用getXXX方法取出OUT參數(shù)的結(jié)果。 返回結(jié)果的數(shù)據(jù)類型是與用戶注冊(cè)的SQL類型相對(duì)應(yīng)的Java類型。空值的處理步驟是,先讀出參數(shù)值,再用CallableStatement.was-Null方法判斷是否為空值。 不支持以流形式讀出OUT參數(shù)的機(jī)制。 接收時(shí)返回結(jié)果的順序優(yōu)先于OUT參數(shù)。

(4)數(shù)據(jù)截?cái)?在某種條件下,有可能在讀或?qū)憯?shù)據(jù)時(shí)出現(xiàn)數(shù)據(jù)截?cái)?如當(dāng)由Connection.setMaxField-Size設(shè)置了一個(gè)域的***長(zhǎng)度時(shí),超過設(shè)置長(zhǎng)度后的數(shù)據(jù)就被截?cái)唷?在讀數(shù)據(jù)時(shí),如出現(xiàn)數(shù)據(jù)截?cái)?則產(chǎn)生一條Data-Truncation 的 SQLWarning警告。在寫數(shù)據(jù)時(shí),如發(fā)生數(shù)據(jù)截?cái)?則產(chǎn)生一個(gè)DataTruncation的SQLException異常。

4. SQL數(shù)據(jù)類型到Java類型的轉(zhuǎn)換 由于SQL數(shù)據(jù)類型與Java數(shù)據(jù)類型之間差異較大,可相互轉(zhuǎn)換的類型之間還是存在一些不一致的地方,因此JDBC提供了詳細(xì)的從SQL類型到Java類型的標(biāo)準(zhǔn)轉(zhuǎn)換表和從Java類型到SQL類型的標(biāo)準(zhǔn)轉(zhuǎn)換表。

三、進(jìn)一步了解JDBC API 1.異步、線程和交易

(1)異步請(qǐng)求 某些數(shù)據(jù)庫(kù)API (比如ODBC) 提供了SQL語(yǔ)句異步執(zhí)行的機(jī)制,這樣可使一個(gè)數(shù)據(jù)庫(kù)的操作在后臺(tái)運(yùn)行的同時(shí),前臺(tái)一邊等待一邊處理其它操作。 由于Java提供多線程機(jī)制,因此并不真正需要實(shí)現(xiàn)異步SQL語(yǔ)句的執(zhí)行。當(dāng)需要異步執(zhí)行時(shí),可通過創(chuàng)建一個(gè)新線程來實(shí)現(xiàn)數(shù)據(jù)庫(kù)操作。

(2)多線程 對(duì)java.sql的所有對(duì)象的操作是多線程安全的,并且當(dāng)多個(gè)線程同時(shí)訪問一個(gè)對(duì)象時(shí),也保證操作的正確性。盡管不同的驅(qū)動(dòng)程序其并發(fā)執(zhí)行程度可能不同,但開發(fā)人員可以假定為完全并發(fā)執(zhí)行的。因?yàn)轵?qū)動(dòng)程序若需要某種形式的同步操作,則一定會(huì)提供相應(yīng)的實(shí)現(xiàn)機(jī)制。 另一個(gè)多線程的特殊應(yīng)用是可以取消一個(gè)執(zhí)行時(shí)間過長(zhǎng)的語(yǔ)句操作。具體做法是啟動(dòng)另一個(gè)線程調(diào)用Statement.cancel()方法

(3)交易 每一個(gè)新的JDBC連接都初始化為"自動(dòng)提交"模式,即意味著每一條語(yǔ)句作為一個(gè)分開的交易來執(zhí)行。 當(dāng)需要把多條語(yǔ)句作為一個(gè)完整的交易來執(zhí)行時(shí),可以調(diào)用Connection.setAutoCommit(false)方法,取消自動(dòng)提交。執(zhí)行完一個(gè)交易后,調(diào)用Connection.Commit顯式完成提交,或調(diào)用Connection.rollback卷回整個(gè)交易操作。 當(dāng)一個(gè)交易被提交或卷回后,關(guān)閉所有在此連接上的PreparedStatements、CallableStatements和ResultSets,只有簡(jiǎn)單的Statements是打開狀態(tài)。

2.指針

JDBC支持簡(jiǎn)單指針,這里說的指針是指SQL數(shù)據(jù)庫(kù)中的概念。應(yīng)用程序可以用ResultSet.GetCursorName()方法,取得與當(dāng)前Resultset相關(guān)聯(lián)的指針,利用該指針可以對(duì)當(dāng)前行進(jìn)行修改和刪除。 指針的有效期是到ResultSet或其父語(yǔ)句結(jié)束。

3.對(duì)SQL的擴(kuò)充 JDBC全部支持SQL-2基本(Entry)級(jí)規(guī)范,部分支持SQL-2過渡(Transitional)級(jí)規(guī)范。對(duì)SQL-2基本級(jí)擴(kuò)充有二點(diǎn):一是支持DROP TABLE命令;二是選定的過渡級(jí)語(yǔ)義必須通過Escape語(yǔ)法來支持,以便一個(gè)驅(qū)動(dòng)程序可以方便地掃描和翻譯成特定DBMS語(yǔ)法。

(1) SQL Escape語(yǔ)法 在存儲(chǔ)過程、標(biāo)量函數(shù)、日期、時(shí)間、輸出連接等方面,JDBC支持與ODBC相同的DBMS無(wú)關(guān)的Escape轉(zhuǎn)義語(yǔ)法,格式為: {關(guān)鍵字……參數(shù)……}

(2)存儲(chǔ)過程 JDBC中激活一個(gè)存儲(chǔ)過程語(yǔ)法格式是: { call 過程名[參數(shù)1,參數(shù)2,…] } 或者是帶返回結(jié)果參數(shù)的過程: { ? = call 過程名[參數(shù)1,參數(shù)2,…] } (3)時(shí)間和時(shí)期文字量 JDBC支持這些文字量的ISO標(biāo)準(zhǔn)格式,用Escape轉(zhuǎn)義的語(yǔ)句表示時(shí)間和日期,如{ d 'yyyy-mm-dd'}或{ t 'nn:mm:ss'} 分別表示日期或時(shí)間。

(4)標(biāo)量函數(shù) JDBC支持標(biāo)量值的數(shù)值、串、時(shí)間、日期、系統(tǒng)和轉(zhuǎn)換函數(shù),如,{ fn concat ("Hot", "Java") }。

(5)輸出連接 語(yǔ)法格式為:{ oj outer-join } 其中outer-join形式為: table LEFT OUTER JOIN { table( outer-join} ON search-condition

4.動(dòng)態(tài)數(shù)據(jù)庫(kù)訪問

盡管我們希望JDBC程序員在編程時(shí)能夠了解數(shù)據(jù)庫(kù)的模式,以便使用強(qiáng)類型的JDBC界面對(duì)數(shù)據(jù)庫(kù)進(jìn)行訪問。但一個(gè)應(yīng)用程序,有時(shí)需要?jiǎng)討B(tài)得到數(shù)據(jù)庫(kù)模式,并以此信息完成相應(yīng)的動(dòng)態(tài)數(shù)據(jù)庫(kù)訪問。

(1)元數(shù)據(jù)信息 JDBC能夠?qū)υ獢?shù)據(jù)進(jìn)行訪問,比如行結(jié)果描述、語(yǔ)句參數(shù)、數(shù)據(jù)庫(kù)特性等。 Java.Sql.ResultSetMetaData類型提供了大量方法去獲得一個(gè)指定 Java.sql.ResultSet對(duì)象列的類型和特性。 Java.Sql.DatabaseMetaData界面提供一系列方法去獲得與某一數(shù)據(jù)庫(kù)相關(guān)聯(lián)的各種元數(shù)據(jù),包含數(shù)據(jù)庫(kù)的過程、表、模式等和表中的列、列的訪問權(quán)、表的訪問權(quán)等信息。

(2)動(dòng)態(tài)類型數(shù)據(jù)訪問 JDBC使用ResultSet.getObject、PreparedStatement.setObject和CallableStatement.getObject方法支持更一般的數(shù)據(jù)訪問。動(dòng)態(tài)訪問時(shí)從SQL類型到Java對(duì)象類型的轉(zhuǎn)換表和從Java對(duì)象類型到SQL類型的轉(zhuǎn)換表在此就不加以列舉了。但上述三個(gè)方法中類型轉(zhuǎn)換的依據(jù)是這兩張表。

四、結(jié)束語(yǔ)

Java語(yǔ)言提供了訪問數(shù)據(jù)庫(kù)的API,這非常有助于其拓寬應(yīng)用范圍。由于目前僅實(shí)現(xiàn)了一個(gè)基礎(chǔ)的API,所以希望開發(fā)人員以此為基礎(chǔ),建立更高級(jí)的類和應(yīng)用工具,同時(shí),也希望諸多開發(fā)商提供多種數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序,以滿足編程人員訪問不同數(shù)據(jù)庫(kù)資源的需要。

【編輯推薦】

  1. 談?wù)剝?yōu)化JDBC數(shù)據(jù)庫(kù)編程
  2. 實(shí)例說明對(duì)MySQL的JDBC連接設(shè)置
  3. 淺談如何利用JSP網(wǎng)頁(yè)中JDBC代碼連接MySQL
  4. 淺談JDBC代碼如何重復(fù)使用
  5. 如何進(jìn)行Jython數(shù)據(jù)庫(kù)插入(JDBC)
責(zé)任編輯:彭凡 來源: ccw.com.cn
相關(guān)推薦

2009-07-01 16:01:58

JSP數(shù)據(jù)庫(kù)

2011-06-24 15:57:35

SQL AzureDAC

2009-07-20 15:56:08

JDBC連接數(shù)據(jù)庫(kù)步驟

2009-07-14 17:18:23

JDBC怎么連接數(shù)據(jù)庫(kù)

2009-07-07 17:42:28

2016-10-27 13:40:02

編程語(yǔ)言 數(shù)據(jù)庫(kù)

2009-07-02 09:00:25

JDBC設(shè)計(jì)JSP訪問數(shù)據(jù)庫(kù)

2009-03-16 09:09:18

數(shù)據(jù)庫(kù)JDBCJSP

2009-07-15 16:23:54

Java JDBC

2009-09-15 10:02:44

Linq to SQL

2009-04-10 09:22:48

SQL Server并發(fā)測(cè)試

2020-08-31 07:00:00

數(shù)據(jù)庫(kù)數(shù)據(jù)庫(kù)同步

2009-07-20 15:42:59

JDBC是什么

2009-07-14 18:13:36

Microsoft J

2009-05-14 14:23:25

微軟ado.netLINQ

2009-07-20 16:40:55

JDBC訪問SQL S

2021-11-26 22:07:57

數(shù)據(jù)庫(kù)管理Mongodb

2009-12-02 10:33:34

LINQ to SQL

2009-07-06 17:23:34

JDBC連接數(shù)據(jù)庫(kù)

2009-07-16 17:22:56

JDBC數(shù)據(jù)庫(kù)編程
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)