java數(shù)據(jù)庫的連接技術(shù)(Java DataBase Connectivity),能實(shí)現(xiàn)Java程序以各種數(shù)據(jù)庫的訪問
由一組使用Java語言編寫的類和接口(JDBC API)組成,它java.sql以及javax.sql中
二、JDBC 原理以及驅(qū)動(dòng)程序的分類2.1、JDBC 原理原來的 SUN 公司(現(xiàn)在是Oracle 公司)在開發(fā)JDBC API 時(shí),將這些接口和類放在了兩個(gè)包中,java.sql 包和javax.sql 包中。而主要的接口和類都是在java.sql 包中,javax 包叫做擴(kuò)展包,javax.sql 包中有一些關(guān)于數(shù)據(jù)源、連接池和其他的一些擴(kuò)展的接口和類。JDBC 中最常用的幾個(gè)接口和類是 DriverManager 類、Connection 接口、Statement 接口、ResultSet 接口,DriverManager 這個(gè)類是管理驅(qū)動(dòng)程序的,可以獲得數(shù)據(jù)庫連接對象。JDBC的驅(qū)動(dòng)程序是實(shí)現(xiàn)了JDBC API 接口的類,由數(shù)據(jù)庫廠商來提供,所以我們在使用JDBC 連接數(shù)據(jù)庫的時(shí)候,需要導(dǎo)入數(shù)據(jù)庫的驅(qū)動(dòng)包,連接不同的數(shù)據(jù)庫,需要導(dǎo)入不同的包。而我們在編寫Java 應(yīng)用程序時(shí),基本上不用太關(guān)心這些包中的類。我們只需要用JDBC 的接口進(jìn)行編程就可以了,也就是java.sql 包和javax.sql 包中的接口。這些接口的對象都是通過其他對象來獲得的,我們不需要通過new 來創(chuàng)建它們。而這些對象的具體實(shí)現(xiàn)都是在驅(qū)動(dòng)程序中實(shí)現(xiàn)的,是驅(qū)動(dòng)程序類的對象。
2.2、驅(qū)動(dòng)程序分類通過JDBC-ODBC 橋,開發(fā)者可以使用JDBC 來訪問一個(gè)ODBC 數(shù)據(jù)源。JDBC-ODBC 橋驅(qū)動(dòng)程序?yàn)镴ava 應(yīng)用程序提供了一種把JDBC 調(diào)用映射為ODBC 調(diào)用的方法。只要本地機(jī)裝有相關(guān)的ODBC 驅(qū)動(dòng),那么采用JDBC-ODBC 橋幾乎可以訪問所有的數(shù)據(jù)庫。但是,由于JDBC-ODBC 先調(diào)用ODBC 再由ODBC 去調(diào)用本地?cái)?shù)據(jù)庫接口來訪問數(shù)據(jù)庫。所以,執(zhí)行效率比較低,對于那些大數(shù)據(jù)量存取的應(yīng)用是不適合的。而且,這種方法要求客戶端必須安裝ODBC 驅(qū)動(dòng),所以對于基于internet 和intranet 的應(yīng)用也是不合適的。因?yàn)椋悴豢赡芤笏锌蛻舳寄苷业絆DBC 驅(qū)動(dòng)。
使用JDBC-ODBC 進(jìn)行橋連步驟如下:
1、配置數(shù)據(jù)源:控制面板→管理工具→ODBC 數(shù)據(jù)源→系統(tǒng)DSN2、編程,通過橋連方式與數(shù)據(jù)庫建立連接

2.4、純Java 驅(qū)動(dòng)
純Java 驅(qū)動(dòng)直接把JDBC 調(diào)用轉(zhuǎn)換為符合相關(guān)數(shù)據(jù)庫系統(tǒng)規(guī)范的請求。用這種驅(qū)動(dòng)編寫的應(yīng)用程序可以直接和數(shù)據(jù)庫服務(wù)器通訊。這種類型的驅(qū)動(dòng)完全由Java 實(shí)現(xiàn),因此實(shí)現(xiàn)了平臺(tái)獨(dú)立性。
由于純Java 驅(qū)動(dòng)不需要先把JDBC 的調(diào)用傳給ODBC 或本地?cái)?shù)據(jù)庫接口或者是中間層服務(wù)器,而是將JDBC 調(diào)用直接轉(zhuǎn)換為DBMS 所使用的網(wǎng)絡(luò)協(xié)議,所以它的執(zhí)行效率是非常高的。這種驅(qū)動(dòng)程序可以動(dòng)態(tài)的被下載。但是它有一個(gè)缺點(diǎn),就是對于不同的數(shù)據(jù)庫,需要下載不同的驅(qū)動(dòng)程序。
使用純Java 驅(qū)動(dòng)方式進(jìn)行直連的步驟:1、下載數(shù)據(jù)庫廠商提供的驅(qū)動(dòng)程序包2、將驅(qū)動(dòng)程序包引入工程中3、編程,通過純Java 驅(qū)動(dòng)方式與數(shù)據(jù)庫建立連接

要使用 JDBC 連接和操作數(shù)據(jù)庫,有一套固定的步驟。依照這些步驟,可以保證你正確的連接到數(shù)據(jù)庫并且操作它。
JDBC 的API 中主要定義了一些連接和操作數(shù)據(jù)庫的接口,而具體的類卻很少。這是因?yàn)椋陂_發(fā)Java 的API 的時(shí)候,不可能讓JDBC 連接某個(gè)具體的數(shù)據(jù)庫,而只能確定一組規(guī)范。而連接具體數(shù)據(jù)庫的實(shí)現(xiàn),應(yīng)該由數(shù)據(jù)庫的廠商來做。通過統(tǒng)一的JDBC 規(guī)范,使得我們在連接各種數(shù)據(jù)庫的時(shí)候,編碼的方式是一樣的,這樣更利于代碼的復(fù)用和移植.
從上面JDBC 編程步驟中可以看出,使用JDBC 操作數(shù)據(jù)庫需要依賴幾個(gè)主要的JDBC API,接下來介紹這幾個(gè)JDBC API 的使用
4.1、DriverManager 類是用來管理數(shù)據(jù)庫驅(qū)動(dòng)的java.sql 包中大多數(shù)都是接口,這是為數(shù)不多的類之一。它是非常常用的一個(gè)類,最主要的功能就是獲得數(shù)據(jù)庫的連接,它定義了三個(gè)連接數(shù)據(jù)庫的方法,差別在參數(shù)的數(shù)量上。三個(gè)參數(shù)的getConnection()方法是最常用的。三個(gè)參數(shù)分別是數(shù)據(jù)庫的URL、用戶名和密碼。
| 返回類型 | 方法簽名 | 說明 |
| static Connection | getConnection(String url) | 試圖建立到給定數(shù)據(jù)庫URL 的連接 |
| static Connection | getConnection(String url,PRoperties info) | 試圖建立到給定數(shù)據(jù)庫URL 的連接 |
| static Connection | getConnection(String url,String user, String passWord) | 試圖建立到給定數(shù)據(jù)庫URL 的連接 |
由數(shù)據(jù)庫廠商來實(shí)現(xiàn),獲得Connection 對象的方法是通過DriverManager 類的getConnection()方法。通過Connection 對象, 我們可以獲得操作數(shù)據(jù)庫的Statement 、PreparedStatement ,CallableStatement 等對象。這些對象是用來執(zhí)行SQL 和存儲(chǔ)過程的
4.3、Statement 接口的對象是用來執(zhí)行SQL 語句的,而且是執(zhí)行靜態(tài)的SQL 語句Statement 接口的對象是用來執(zhí)行SQL 語句的,而且是執(zhí)行靜態(tài)的SQL 語句。所謂的靜態(tài)SQL 語句,是指SQL 語句由一個(gè)固定的SQL 字符串確定,運(yùn)行期不能修改參數(shù)
| 返回類型 | 方法簽名 | 說明 |
| int | executeUpdate(String sql) | 執(zhí)行給定 SQL 語句,該語句可能為 INSERT、UPDATE 或DELETE語句,或者不返回任何內(nèi)容的 SQL 語句(如 SQL DDL 語句) |
| ResultSet | executeQuery(String sql) | 執(zhí)行給定的 SQL 語句,該語句返回單個(gè) ResultSet 對象 |
| void | close() | 立即釋放此 Statement 對象的數(shù)據(jù)庫和 JDBC 資源,而不是等待該對象自動(dòng)關(guān)閉時(shí)發(fā)生此操作 |
當(dāng)我們調(diào)用Statement 的executeQuery()方法時(shí),就會(huì)得到一個(gè)ResultSet 的對象。ResultSet 對象中包含根據(jù)查詢語句查詢出來的一個(gè)結(jié)果集,但是,實(shí)際上這些內(nèi)容還是在數(shù)據(jù)庫當(dāng)中,還并沒有真正的取出到虛擬機(jī)的內(nèi)存中。ResultSet 其實(shí)是保存了一個(gè)指向其當(dāng)前數(shù)據(jù)行的游標(biāo),我們需要使用ResultSet 的方法讓游標(biāo)一行一行的向下移動(dòng),然后獲取每一行的數(shù)據(jù),所以在操作ResultSet 對象期間,數(shù)據(jù)庫連接不能關(guān)閉。
| 返回類型 | 方法簽名 | 說明 |
| boolean | next() | 將CURSOR(游標(biāo))從當(dāng)前位置向前移一行 |
| Type | getType(String columnLabel) | 根據(jù)數(shù)據(jù)庫表的列名得到指定列的值 |
| Type | getType(intcolumnIndex) | 根據(jù)列的序號(hào)得到指定列的值,第一列的序號(hào)是1。 |
| void | close() | 立即釋放此 ResultSet 對象的數(shù)據(jù)庫和 JDBC 資源,而不是等待該對象自動(dòng)關(guān)閉時(shí)發(fā)生此操作 |
java.sql5.1、java.sql描述編程語言訪問并處理存儲(chǔ)在數(shù)據(jù)源(通常是一個(gè)關(guān)系數(shù)據(jù)庫)中的數(shù)據(jù)的 API。此 API 包括一個(gè)框架,憑借此框架可以動(dòng)態(tài)地安裝不同驅(qū)動(dòng)程序來訪問不同數(shù)據(jù)源。盡管 JDBCTM API 主要用于將 SQL 語句傳遞給數(shù)據(jù)庫,但它還可以用于以表格方式從任何數(shù)據(jù)源中讀寫數(shù)據(jù)。通過接口的 javax.sql.RowSet 組可以使用的 reader/writer 實(shí)用程序,可以被定制以使用和更新來自電子表格、純文本文件或其他任何表格式數(shù)據(jù)源的數(shù)據(jù)
java.sql 包中包含用于以下方面的 API:
DriverManager 實(shí)用程序建立與數(shù)據(jù)庫的連接DriverManager 類:建立與驅(qū)動(dòng)程序的連接SQLPermission 類:當(dāng)代碼在 Security Manager(比如 applet)中運(yùn)行時(shí)提供權(quán)限,試圖通過 DriverManager 設(shè)置一個(gè)記錄流Driver 接口:提供用來注冊和連接基于 JDBC 技術(shù)(“JDBC 驅(qū)動(dòng)程序”)的驅(qū)動(dòng)程序的 API,通常僅由 DriverManager 類使用DriverPropertyInfo 類:提供 JDBC 驅(qū)動(dòng)程序的屬性,不是供一般用戶使用的Statement:用于發(fā)送基本 SQL 語句PreparedStatement:用于發(fā)送準(zhǔn)備好的語句或基本 SQL 語句(派生自 Statement)CallableStatement:用于調(diào)用數(shù)據(jù)庫存儲(chǔ)過程(派生自 PreparedStatement)Connection 接口:提供創(chuàng)建語句以及管理連接及其屬性的方法Savepoint:在事務(wù)中提供保存點(diǎn)ResultSet 接口Array 接口:SQL ARRAY 的映射關(guān)系Blob 接口:SQL BLOB 的映射關(guān)系Clob 接口:SQL CLOB 的映射關(guān)系Date 類:SQL DATE 的映射關(guān)系NClob 接口:SQL NCLOB 的映射關(guān)系Ref 接口:SQL REF 的映射關(guān)系RowId 接口:SQL ROWID 的映射關(guān)系Struct 接口:SQL STRUCT 的映射關(guān)系SQLxml 接口:SQL XML 的映射關(guān)系Time 類:SQL TIME 的映射關(guān)系Timestamp 類:SQL TIMESTAMP 的映射關(guān)系Types 類:提供用于 SQL 類型的常量SQLData 接口:指定 UDT 到此類的一個(gè)實(shí)例的映射關(guān)系SQLInput 接口:提供用來從流中讀取 UDT 屬性的方法SQLOutput 接口:提供用來將 UDT 屬性寫回流中的方法DatabaseMetaData 接口:提供有關(guān)數(shù)據(jù)庫的信息ResultSetMetaData 接口:提供有關(guān) ResultSet 對象的列的信息ParameterMetaData 接口:提供有關(guān) PreparedStatement 命令的參數(shù)的信息SQLException:由大多數(shù)方法在訪問數(shù)據(jù)出問題時(shí)拋出,以及因?yàn)槠渌蛴善渌恍┓椒⊕伋?/li>SQLWarning:為了指示一個(gè)警告而拋出DataTruncation:為了指示數(shù)據(jù)可能已經(jīng)被截?cái)喽鴴伋?/li>BatchUpdateException:為了指示并不是批量更新中的所有命令都成功執(zhí)行而拋出JDBC 4.0 API 中引入的 java.sql 和 javax.sql 特性
Class.forName 來加載 java.sql.Driver 類PooledConnection 關(guān)聯(lián)的 PreparedStatement 已關(guān)閉或驅(qū)動(dòng)程序確定為無效時(shí)要通知的可用性新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注