JDBC是Sun公司制定的一個可以
用Java語言連接數據庫的技術 。
一、JDBC基礎知識 ? ? ? ?
? ? ? ?
JDBC(Java Data Base Connectivity,java數據庫連接)
是一種用于執行SQL語句的Java API ,可以為多種關系數據庫提供統一訪問,它由一組用Java語言編寫的類和接口組成。JDBC為數據庫開發人員提供了一個標準的API,據此可以構建更高級的工具和接口,使數據庫開發人員能夠用純 Java API 編寫數據庫應用程序,并且可跨平臺運行,并且不受數據庫供應商的限制。
1、跨平臺運行:這是繼承了Java語言的“一次編譯,到處運行”的特點;
2、不受數據庫供應商的限制:巧妙在于JDBC設有兩種接口,一個是面向應用程序層,其作用是使得開發人員通過SQL調用數據庫和處理結果,而不需要考慮數據庫的提供商;另一個是驅動程序層,處理與具體驅動程序的交互,JDBC驅動程序可以利用JDBC API創建Java程序和數據源之間的橋梁。應用程序只需要編寫一次,便可以移到各種驅動程序上運行。Sun提供了一個驅動管理器,數據庫供應商——如MySQL、Oracle,提供的驅動程序滿足驅動管理器的要求就可以被識別,就可以正常工作。所以JDBC不受數據庫供應商的限制。
?JDBC API可以作為連接Java應用程序與各種關系數據庫的紐帶,在帶來方便的同時也有負面影響,以下是JDBC的優、缺點。
優點如下:
操作便捷:JDBC使得開發人員不需要再使用復雜的驅動器調用命令和函數;
可移植性強:JDBC支持不同的關系數據庫,所以可以使同一個應用程序支持多個數據庫的訪問,只要加載相應的驅動程序即可;
通用性好:JDBC-ODBC橋接驅動器將JDBC函數換成ODBC;
面向對象:可以將常用的JDBC數據庫連接封裝成一個類,在使用的時候直接調用即可。
缺點如下:
訪問數據記錄的速度受到一定程度的影響;
更改數據源困難:JDBC可支持多種數據庫,各種數據庫之間的操作必有不同,這就給更改數據源帶來了很大的麻煩
二、JDBC連接數據庫的流程及其原理
1、在開發環境中
加載指定數據庫的驅動程序 。例如,接下來的實驗中,使用的數據庫是Oracle,所以需要去下載Oracle支持JDBC的驅動程序(其實這個地方并不需要去官網上下載jdbc驅動,本地安裝的Oracle中就有,是一個ojdbc14.jar的文件);而開發環境是MyEclipse,將下載得到的驅動程序加載進開發環境中(具體示例的時候會講解如何加載)。
2、在Java程序中加載驅動程序 。在Java程序中,可以通過 “Class.forName(“指定數據庫的驅動程序”) ” 方式來加載添加到開發環境中的驅動程序,例如加載Oracle的數據驅動程序的代碼為: ?Class.forName(“oracle.jdbc.driver.OracleDriver”)。
3、
創建數據連接對象:通過DriverManager類創建數據庫連接對象Connection 。DriverManager類作用于Java程序和JDBC驅動程序之間,用于檢查所加載的驅動程序是否可以建立連接,然后通過它的getConnection方法,根據數據庫的URL、用戶名和密碼,創建一個JDBC Connection 對象。如:
Connection connection = ?DriverManager.getConnection(“連接數據庫的URL", "用戶名", "密碼”) 。其中,URL=協議名+IP地址(域名)+端口+數據庫名稱;用戶名和密碼是指登錄數據庫時所使用的用戶名和密碼。具體示例創建Oracle的數據庫連接代碼如下:
conn=DriverManager.getConnection(url, user, password);
4、創建Statement對象 :Statement 類的主要是用于執行靜態 SQL 語句并返回它所生成結果的對象。 通過Connection 對象的 createStatement()方法可以創建一個Statement對象。例如:Statement statament = connection.createStatement(); 具體示例創建Statement對象代碼如下:
? Statement statamentMySQL =connectMySQL.createStatement();?
5、調用Statement對象的相關方法執行相對應的 SQL 語句 :通過execuUpdate()方法用來數據的更新,包括插入和刪除等操作 ,例如向staff表中插入一條數據的代碼:
? ? ? ?statement.excuteUpdate( "INSERT INTO staff(name, age, sex,address, depart, worklen,wage)" + " VALUES ('Tom1', 321, 'M', 'china','Personnel','3','3000' ) ") ;?
通過調用Statement對象的executeQuery()方法進行數據的查詢,而查詢結果會得到 ResulSet對象 ,ResulSet表示執行查詢數據庫后返回的數據的集合,ResulSet對象具有可以指向當前數據行的指針。通過該對象的next()方法,使得指針指向下一行,然后將數據以列號或者字段名取出。如果當next()方法返回null,則表示下一行中沒有數據存在。使用示例代碼如下:?ResultSet resultSel = statement.executeQuery( "select * from staff" );
6、關閉數據庫連接 :使用完數據庫或者不需要訪問數據庫時,通過Connection的close() 方法及時關閉數據連接 。
三、JDBC應用示例實驗
實驗 步驟:
S1、下載ojdbc14.jar驅動文件,并將該文件放到你的項目中去;?
S2、在MyEclipse中的項目中添加Oracle驅動程序:在項目名上右鍵-> Build Path ->Add External Archiver然后選擇你剛才放在項目中的文件, 點確定即可。
S3、打開Oracle的各項服務,并在Oracle中建一張表。
S4、編寫MyEclipse與Oracle的連接程序:
import?java.sql.Connection;???? import?java.sql.DriverManager;???? import?java.sql.PreparedStatement;???? import?java.sql.ResultSet;???? import?java.sql.Statement;???? import?java.sql.*?;???? ???? public?class?JDBC_Test?{???? ????//orcl為oracle數據庫中的數據庫名,localhost表示連接本機的oracle數據庫????? ? ? //1521為連接的端口號????? ????private?static?String?url = "jdbc:oracle:thin:@localhost:1521:orcl" ;???? ????//system為登陸oracle數據庫的 用戶名 ?? ??? ????private?static?String?user = "system" ;???? ????//manager為用戶名system的密碼????? ????private?static?String?password = "manager" ;???? ????public?static?Connection?conn;???? ????public?static?PreparedStatement?ps;???? ????public?static?ResultSet?rs;???? ????public?static?Statement?st?;???? ????//連接數據庫的方法????? ????public?void?getConnection(){???? ????????try?{???? ????????????//初始化驅動包????? ????????????Class.forName("oracle.jdbc.driver.OracleDriver");???? ????????????//根據數據庫連接字符,名稱,密碼給conn賦值????? ????????????conn = DriverManager .getConnection(url,?user,?password);???? ???????????????? ????????}?catch?(Exception?e)?{???? ????????????//?TODO:?handle?exception????? ????????????e.printStackTrace();???? ????????}???? ????}???? ?????//測試能否與oracle數據庫連接成功????? ?????public?static?void?main(String[]?args)?{???? ????????JDBC_Test?basedao = new ?JDBC_Test();???? ????????basedao.getConnection();???? ????????if(conn ==null){???? ????????????System.out.println("與oracle數據庫連接失敗!");???? ????????}else{???? ????????????System.out.println("與oracle數據庫連接成功!");???? ????????}???? ?????}???? } ?
s5、如果上述的連接已經建立,就可以利用JDBC中的Java?API對數據庫進行操作了,具體的查詢,插入,刪除,更新操作如下
import?java.sql.Connection;???? import?java.sql.DriverManager;???? import?java.sql.ResultSet;???? import?java.sql.SQLException;???? import?java.sql.Statement;???? ???? public?class?JDBC_Test?{???? ????//?創建靜態全局變量????? ????static?Connection?conn; ? ? ????static?Statement?st;???? ???? ????public?static?void?main(String[]?args)?{???? ????????insert();???//插入添加記錄????? ????????update();???//更新記錄數據????? ????????delete();???//刪除記錄????? ????????query();????//查詢記錄并顯示????? ????}???? ???????? ????/*?插入數據記錄,并輸出插入的數據記錄數*/???? ????public?static?void?insert()?{ ? ? ????????conn ?=? getConnection ();?//?首先要獲取連接,即連接到數據庫 ? ? ????????try?{???? ? ??//?插入數據的sql語句? ????????????String?sql ?=? "INSERT?INTO?staff(name,?age,?sex,address,?depart,?worklen,wage)" ???? ????????????????????+?"?VALUES?('Tom1',?32,?'M',?'china','Personnel','3','3000')"; ? ? ? ????????????//?創建用于執行靜態sql語句的Statement對象 ? ?? ??? ????????????st ?=?(Statement)?conn.createStatement(); ?? ? ? ? ? ? ? //?執行插入操作的sql語句,并返回插入數據的個數? ? ? ????????????int?count ?=? st .executeUpdate(sql);? ????????????//輸出插入操作的處理結果 ? ???? ????????????System.out.println("向staff表中插入?"?+?count?+?"?條數據");?//輸出插入操作的處理結果????? ????????????//關閉數據庫連接 ? ??? ????????????conn.close(); ? ?? ???????????????? ????????}?catch?(SQLException?e)?{???? ????????????System.out.println("插入數據失敗"?+?e.getMessage());???? ????????}???? ????}???? ???????? ????/*?更新符合要求的記錄,并返回更新的記錄數目*/???? ????public?static?void?update()?{???? //同樣先要獲取連接,即連接到數據庫? ????????conn ?=? getConnection (); ? ? ? ????????try?{???? ? ??//?更新數據的sql語句? ????????????String?sql ?=? "update?staff?set?wage='2200'?where?name?=?'lucy'" ; ? ? ????????????//創建用于執行靜態sql語句的Statement對象,st屬 局部變量? ?? ???? ????????????st ?=?(Statement)?conn.createStatement();????? ? ? ? ? ? ? //?執行更新操作的sql語句,返回更新數據的個數 ?? ? ????????????int?count ?=? st .executeUpdate(sql); ? ? ? ? ? ? ? ?//輸出更新操作的處理結果 ? ? ? ????????????System.out.println("staff表中更新?"?+?count?+?"?條數據"); ? ? ? ? ? ? ? ? ? ? ?//關閉數據庫連接 ? ?? ????????????conn.close(); ? ?? ???????????????? ????????}?catch?(SQLException?e)?{???? ????????????System.out.println("更新數據失敗");???? ????????}???? ????}???? ???? ????/*?查詢數據庫,輸出符合要求的記錄的情況*/???? ????public?static?void?query()?{???? ????????//同樣先要獲取連接,即連接到數據庫 ? ???? ????????conn ?=? getConnection (); ? ? ????????try?{?? ? ??//?查詢數據的sql語句? ?? ????????????String?sql ?=? "select?*?from?staff" ; ?? ? ??//創建用于執行靜態sql語句的Statement對象,st屬局部變量? ????????????st ?=?(Statement)?conn.createStatement(); ? ? ? ? ?????????????//執行sql查詢語句,返回查詢數據的結果集 ??? ????????????ResultSet?rs ?=? st .executeQuery(sql); ?? ????????????System.out.println("最后的查詢結果為:");???? ????????????while?(rs.next())?{?//?判斷是否還有下一個數據????? ???????????????????? ????????????????//?根據字段名獲取相應的值????? ????????????????String?name ?=? rs .getString("name");???? ????????????????int?age ?=? rs .getInt("age");???? ????????????????String?sex ?=? rs .getString("sex");???? ????????????????String?address ?=? rs .getString("address");???? ????????????????String?depart ?=? rs .getString("depart");???? ????????????????String?worklen ?=? rs .getString("worklen");???? ????????????????String?wage ?=? rs .getString("wage");???? ???????????????????? ????????????????//輸出查到的記錄的各個字段的值????? ????????????????System.out.println(name?+?"?"?+?age?+?"?"?+?sex?+?"?"?+?address???? ????????????????????????+?"?"?+?depart?+?"?"?+?worklen?+?"?"?+?wage);???? ???????????????? ????????????}???? ????????????conn.close();???//關閉數據庫連接????? ???????????????? ????????}?catch?(SQLException?e)?{???? ????????????System.out.println("查詢數據失敗");???? ????????}???? ????}???? ???? ????/*?刪除符合要求的記錄,輸出情況*/???? ????public?static?void?delete()?{???? ???? //同樣先要獲取連接,即連接到數據庫 ? ????????conn ?=? getConnection (); ? ? ????????try?{???? ? ??//?刪除數據的sql語句 ????????????String?sql ?=? "delete?from?staff??where?name?=?'lili'" ; ? ? ? ??//創建用于執行靜態sql語句的Statement對象,st屬局部變量 ????????????st ?=?(Statement)?conn.createStatement(); ? ? ? ?? ? ? ? ? ? ??//?執行sql刪除語句,返回刪除數據的數量? ????????????int?count ?=? st .executeUpdate(sql); ? ? ? ? ? ? ? ? //輸出刪除操作的處理結果 ?? ????????????System.out.println("staff表中刪除?"?+?count?+?"?條數據\n"); ? ? ? ?? ? ? ? ? ? ? ?//關閉數據庫連接 ?? ????????????conn.close(); ? ? ?? ???????????????? ????????}?catch?(SQLException?e)?{???? ????????????System.out.println("刪除數據失敗");???? ????????}???? ???????????? ????}???? ???????? ????/*?獲取數據庫連接的函數*/???? ????public?static?Connection?getConnection()?{??? //創建用于連接數據庫的Connection對象 ? ????????Connection?con ?=? null ; ? ?? ????????try?{???? ????????????Class.forName("com.mysql.jdbc.Driver");//?加載Mysql數據驅動????? ???????????????? ????????????con ?=? DriverManager .getConnection(?? ? ? ? ? //?創建數據連接 ?????? ????????????????????"jdbc:mysql://localhost:3306/myuser",?"root",?"root");? ???????????????? ????????}?catch?(Exception?e)?{???? ????????????System.out.println("數據庫連接失敗"?+?e.getMessage());???? ????????}???? ????????return?con;?//返回所建立的數據庫連接????? ????}???? } ? ?
總結
以上是生活随笔 為你收集整理的利用JDBC连接Oracle数据库 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。