DBC是Sun公司制定的一個能夠用Java語言鏈接數據庫的技術。php
1、JDBC基礎知識 java
JDBC(Java Data Base Connectivity,java數據庫鏈接)是一種用於執行SQL語句的Java API,能夠爲多種關係數據庫提供統一訪問,它由一組用Java語言編寫的類和接口組成。JDBC爲數據庫開發人員提供了一個標準的API,據此能夠構建 更高級的工具和接口,使數據庫開發人員可以用純 Java API 編寫數據庫應用程序,而且可跨平臺運行,而且不受數據庫供應商的限制。mysql
一、跨平臺運行:這是繼承了Java語言的「一次編譯,處處運行」的特色;sql
二、不受數據庫供應商的限制:巧妙在於JDBC設有兩種接口,一個是面向應用程序層,其做用是使得開發人員經過 SQL調用數據庫和處理結果,而不須要考慮數據庫的提供商;另外一個是驅動程序層,處理與具體驅動程序的交互,JDBC驅動程序能夠利用JDBC API建立Java程序和數據源之間的橋樑。應用程序只須要編寫一次,即可以移到各類驅動程序上運行。Sun提供了一個驅動管理器,數據庫供應商——如 MySQL、Oracle,提供的驅動程序知足驅動管理器的要求就能夠被識別,就能夠正常工做。因此JDBC不受數據庫供應商的限制。數據庫
JDBC API能夠做爲鏈接Java應用程序與各類關係數據庫的紐帶,在帶來方便的同時也有負面影響,如下是JDBC的優、缺點。優勢以下:windows
操做便捷:JDBC使得開發人員不須要再使用複雜的驅動器調用命令和函數;函數
可移植性強:JDBC支持不一樣的關係數據庫,因此可使同一個應用程序支持多個數據庫的訪問,只要加載相應的驅動程序便可;工具
通用性好:JDBC-ODBC橋接驅動器將JDBC函數換成ODBC;開發工具
面向對象:能夠將經常使用的JDBC數據庫鏈接封裝成一個類,在使用的時候直接調用便可。網站
缺點以下:
訪問數據記錄的速度受到必定程度的影響;
更改數據源困難:JDBC可支持多種數據庫,各類數據庫之間的操做必有不一樣,這就給更改數據源帶來了很大的麻煩
2、JDBC鏈接數據庫的流程及其原理
一、在開發環境中加載指定數據庫的驅動程序。例如,接下來的實驗中,使用的數據庫是MySQL,因此須要去下載MySQL支持JDBC的驅動程序(最新的是:mysql-connector-java-5.1.18-bin.jar);而開發環境是MyEclipse,將下載獲得的驅動程序加載進開發環境中(具體示例的時候會講解如何加載)。
二、在Java程序中加載驅動程序。在Java程序中,能夠經過 「Class.forName(「指定數據庫的驅動程序」)」 方式來加載添加到開發環境中的驅動程序,例如加載MySQL的數據驅動程序的代碼爲: Class.forName(「com.mysql.jdbc.Driver」)
三、建立數據鏈接對象:經過DriverManager類建立數據庫鏈接對象Connection。DriverManager類做用於Java程序和JDBC驅動程序之間,用於檢查所加載的驅動程序是否能夠創建鏈接,而後經過它的getConnection方法,根據數據庫的URL、用戶名和密碼,建立一個JDBC Connection 對象。如:Connection connection = DriverManager.geiConnection(「鏈接數據庫的URL", "用戶名", "密碼」)。其中,URL=協議名+IP地址(域名)+端口+數據庫名稱;用戶名和密碼是指登陸數據庫時所使用的用戶名和密碼。具體示例建立MySQL的數據庫鏈接代碼以下:
Connection connectMySQL = DriverManager.geiConnection(「jdbc:mysql://localhost:3306/myuser","root" ,"root" );
四、建立Statement對象:Statement 類的主要是用於執行靜態 SQL 語句並返回它所生成結果的對象。經過Connection 對象的 createStatement()方法能夠建立一個Statement對象。例如:Statement statament = connection.createStatement(); 具體示例建立Statement對象代碼以下:
Statement statamentMySQL =connectMySQL.createStatement();
五、調用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" );
六、關閉數據庫鏈接:使用完數據庫或者不須要訪問數據庫時,經過Connection的close() 方法及時關閉數據鏈接。
3、JDBC應用示例實驗
實驗內容:使用phpMyAdmin在MySQL中建立數據庫(myuser),並添加實驗所需的數據(新建staff表,添加一些記錄);編寫Java程序,利用JDBC鏈接在MySQL中建立好的數據庫(myuser),對staff表格進行插入、更新、刪除和查詢等操做。
實驗環境及開發工具:Win7操做系統;jdk1.6.0_26;XAMPP1.7.7(MySQL 5.1, phpMyAdmin);MyEclipse 8.5
實驗環境的搭建:可參考個人博客
Java環境搭配:http://blog.csdn.net/cxwen78/article/details/6400798;
windows系統XAMPP安裝配置使用:http://blog.csdn.net/cxwen78/article/details/6847927
實驗過程及步驟:
一、下載MySQL支持JDBC的驅動程序:若是已經有了,可跳過這一步。前往MySQL官網(http://www.mysql.com/products/connector/ )下載驅動程序,,MySQL針對不一樣的平臺提供了不一樣的鏈接器,咱們須要的是DBC Driver for MySQL (Connector/J),以下圖所示,點擊 Download 跟着網站的引導進行下載。打開下載獲得的壓縮包(mysql-connector-java-5.1.18.zip),將其中的Java包(mysql- connector-java-5.1.18-bin.jar),複製到MySQL目錄下(僅是爲了方便才放到這裏),以備加載驅動程序時使用。
二、建立數據庫:使用phpMyAdmin,登陸MySQL,建立數據庫myuser,並在其中插入一個名爲staff的表格。並添加一些數據,操做步驟如圖,登陸進去MySQL數據庫後:
1)建立數據庫,名稱爲myuser,編碼爲utf8_general_ci(支持中文);
2)新建表格,名稱爲staff,表格有8個字段;
3)8個字段的設置,包括名稱、類型、值的長度、初始值、編碼等等(點擊查看大圖);
4)添加成功後,查看的staff表格狀況:
5)往表格中插入一些實驗所需數據,須要插入兩條,一個是員工lucy的,還有lili的:
三、在MyEclips中建立項目並在項目中添加MySQL驅動程序:建立的項目類型能夠是 Java項目或者是Java Web項目均可以。這裏建立的是Web項目,項目名稱能夠隨便取,我命名爲「JavaWebChp07」。建立成功後將步驟1裏下載獲得的MySQL驅動 程序包(mysql-connector-java-5.1.18-bin.jar)添加到工程的Build path中,添加過程如圖所示:
四、編寫JDBC鏈接MySQL數據庫的實例具體代碼,JDBC_Test.java:
具體代碼:
[java] view plaincopy
<pre name="code" class="java">package chp07; 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 { String sql = "INSERT INTO staff(name, age, sex,address, depart, worklen,wage)" + " VALUES ('Tom1', 32, 'M', 'china','Personnel','3','3000')"; // 插入數據的sql語句 st = (Statement) conn.createStatement(); // 建立用於執行靜態sql語句的Statement對象 int count = st.executeUpdate(sql); // 執行插入操做的sql語句,並返回插入數據的個數 System.out.println("向staff表中插入 " + count + " 條數據"); //輸出插入操做的處理結果 conn.close(); //關閉數據庫鏈接 } catch (SQLException e) { System.out.println("插入數據失敗" + e.getMessage()); } } /* 更新符合要求的記錄,並返回更新的記錄數目*/ public static void update() { conn = getConnection(); //一樣先要獲取鏈接,即鏈接到數據庫 try { String sql = "update staff set wage='2200' where name = 'lucy'";// 更新數據的sql語句 st = (Statement) conn.createStatement(); //建立用於執行靜態sql語句的Statement對象,st屬局部變量 int count = st.executeUpdate(sql);// 執行更新操做的sql語句,返回更新數據的個數 System.out.println("staff表中更新 " + count + " 條數據"); //輸出更新操做的處理結果 conn.close(); //關閉數據庫鏈接 } catch (SQLException e) { System.out.println("更新數據失敗"); } } /* 查詢數據庫,輸出符合要求的記錄的狀況*/ public static void query() { conn = getConnection(); //一樣先要獲取鏈接,即鏈接到數據庫 try { String sql = "select * from staff"; // 查詢數據的sql語句 st = (Statement) conn.createStatement(); //建立用於執行靜態sql語句的Statement對象,st屬局部變量 ResultSet rs = st.executeQuery(sql); //執行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 { String sql = "delete from staff where name = 'lili'";// 刪除數據的sql語句 st = (Statement) conn.createStatement(); //建立用於執行靜態sql語句的Statement對象,st屬局部變量 int count = st.executeUpdate(sql);// 執行sql刪除語句,返回刪除數據的數量 System.out.println("staff表中刪除 " + count + " 條數據\n"); //輸出刪除操做的處理結果 conn.close(); //關閉數據庫鏈接 } catch (SQLException e) { System.out.println("刪除數據失敗"); } } /* 獲取數據庫鏈接的函數*/ public static Connection getConnection() { Connection con = null; //建立用於鏈接數據庫的Connection對象 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; //返回所創建的數據庫鏈接 } }