自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

淺談標準SQL數(shù)據(jù)庫訪問界面—JDBC API

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

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

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

1.JDBC API

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

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

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

3.用戶典型使用模式

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

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

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

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

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

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

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

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

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

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

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

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

三、進一步了解JDBC API 1.異步、線程和交易

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

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

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

2.指針

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

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

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

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

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

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

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

盡管我們希望JDBC程序員在編程時能夠了解數(shù)據(jù)庫的模式,以便使用強類型的JDBC界面對數(shù)據(jù)庫進行訪問。但一個應用程序,有時需要動態(tài)得到數(shù)據(jù)庫模式,并以此信息完成相應的動態(tài)數(shù)據(jù)庫訪問。

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

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

四、結(jié)束語

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

【編輯推薦】

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

2009-07-01 16:01:58

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

2011-06-24 15:57:35

SQL AzureDAC

2009-07-14 17:18:23

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

2009-07-20 15:56:08

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

2009-07-07 17:42:28

2016-10-27 13:40:02

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

2009-03-16 09:09:18

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

2009-07-02 09:00:25

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

2009-09-15 10:02:44

Linq to SQL

2009-07-15 16:23:54

Java JDBC

2009-04-10 09:22:48

SQL Server并發(fā)測試

2009-07-20 15:42:59

JDBC是什么

2020-08-31 07:00:00

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

2009-05-14 14:23:25

微軟ado.netLINQ

2009-07-14 18:13:36

Microsoft J

2009-07-20 16:40:55

JDBC訪問SQL S

2009-07-06 17:23:34

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

2009-07-16 17:22:56

JDBC數(shù)據(jù)庫編程

2021-11-26 22:07:57

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

2009-12-02 10:33:34

LINQ to SQL
點贊
收藏

51CTO技術棧公眾號