JDBC連線MySQL資料庫及演示樣例

weixin_34126215發表於2014-11-02

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、在開發環境中載入指定資料庫的驅動程式。比如,接下來的實驗中,使用的資料庫是MySQL,所以須要去下載MySQL支援JDBC的驅動程式(最新的是:mysql-connector-java-5.1.18-bin.jar);而開發環境是MyEclipse,將下載得到的驅動程式載入進開發環境中(詳細演示樣例的時候會解說怎樣載入)。


2、在Java程式中載入驅動程式。在Java程式中,能夠通過 “Class.forName(“指定資料庫的驅動程式”)” 方式來載入加入�到開發環境中的驅動程式,比如載入MySQL的資料驅動程式的程式碼為:  Class.forName(“com.mysql.jdbc.Driver”)


3、建立資料連線物件:通過DriverManager類建立資料庫連線物件ConnectionDriverManager類作用於Java程式和JDBC驅動程式之間,用於檢查所載入的驅動程式能否夠建立連線,然後通過它的getConnection方法,依據資料庫的URL、username和password,建立一個JDBC Connection 物件。如:Connection connection =  DriverManager.geiConnection(“連線資料庫的URL", "username", "password”)。當中,URL=協議名+IP地址(域名)+port+資料庫名稱;username和password是指登入資料庫時所使用的username和password。詳細演示樣例建立MySQL的資料庫連線程式碼例如以下:

              Connection connectMySQL  =  DriverManager.geiConnection(“jdbc:mysql://localhost:3306/myuser","root" ,"root" );


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、關閉資料庫連線:使用完資料庫或者不須要訪問資料庫時,通過Connectionclose() 方法及時關閉資料連線。


三、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

實驗環境的搭建:可參考我的部落格


實驗過程及步驟:

        1、下載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資料夾下(僅是為了方便才放到這裡),以備載入驅動程式時使用。







        2、建立資料庫:使用phpMyAdmin,登入MySQL,建立資料庫myuser,並在當中插入一個名為staff的表格。並加入�一些資料,操作步驟如圖,登入進去MySQL資料庫後:

               1)建立資料庫,名稱為myuser,編碼為utf8_general_ci(支援中文);

建立資料庫

              2)新建表格,名稱為staff,表格有8個欄位;

                  3)8個欄位的設定,包含名稱、型別、值的長度、初始值、編碼等等(點選檢視大圖);


                4)加入�成功後,檢視的staff表格情況:


                5)往表格中插入一些實驗所需資料,須要插入兩條,一個是員工lucy的,還有lili的:




        3、在MyEclips中建立專案並在專案中加入�MySQL驅動程式:建立的專案型別能夠是Java專案或者是Java Web專案都能夠。這裡建立的是Web專案,專案名稱能夠隨便取,我命名為“JavaWebChp07”。建立成功後將步驟1裡下載得到的MySQL驅動程式包(mysql-connector-java-5.1.18-bin.jar)加入�到project的Build path中,加入�過程如圖所看到的:








        4、編寫JDBC連線MySQL資料庫的例項詳細程式碼,JDBC_Test.java:



詳細程式碼:

<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;	//返回所建立的資料庫連線
	}
}


專案部署到server,然後執行結果:

http://www.5678520.com/kaiwangdian/130.html 

http://www.5678520.com/kaiwangdian/129.html 

http://www.5678520.com/kaiwangdian/128.html 

http://www.5678520.com/kaiwangdian/127.html 

http://www.5678520.com/kaiwangdian/126.html 

http://www.lianzhiwei.com/News/389/20122116.html 

http://www.lianzhiwei.com/News/389/20122115.html 

http://www.lianzhiwei.com/News/389/20122114.html 

http://www.lianzhiwei.com/News/389/20122113.html 

http://www.lianzhiwei.com/News/389/20122112.html 





相關文章