JDBC連接MySql數據庫

學習 JDBC 的時候,我們首先應該瞭解一些基礎知識點:

1、JDBC 全稱:Java DataBase Connectivity

2、數據庫本身是個獨立運行的程序,我們編寫的應用程序是利用通信協議對數據庫進行指令交換。

3、JDBC 是用於執行 SQL 的解決方法,開發人員使用 JDBC 的標準接口,數據庫廠商則對數據庫接口進行操作,開發人員無須接觸底層數據庫驅動程序的差異性。

4、JDBC API 由類和接口構成,這些類和接口用於:建立數據庫的連接,把 SQL 語句發送到數據庫,處理 SQL 語句的結果,以及獲取數據庫的元數據。

5、使用 JDBC 開發任何有關於數據庫的應用程序,都需要注意四個主要接口:Driver、Connection、Statement、ResultSet ,這些接口定義使用 SQL 訪問數據庫的一般架構。訪問數據庫的典型 Java 程序主要採用下列步驟:

    (1)、加載驅動程序(使用 Driver 接口裝載一個合適的驅動程序)

    (2)、建立連接(使用 Connection 接口連接到數據庫)

    (3)、創建和執行語句(使用 Statement 接口創建和執行 SQL 語句)

    (4)、處理結果(如果語句返回數據集結果,可以使用 ResultSet 接口處理該結果)

6、com.mysql.jdbc.Driver 是 mysqljdbc.jar 中的一個類,oracle.jdbc.driver.OracleDriver 是 classes12.jar 中的一個類,mysqljdbc.jar 和 classes12.jar 包含許多支持驅動程序的類,這些類由 JDBC 使用,但不是直接由 JDBC 程序員使用。當我們在程序中明確使用某個類時,他被 JVM 自動加載,但驅動程序沒有在程序中明確地使用,因此,我們必須編寫代碼告訴 JVM 加載它們。


 JDBC 連接 MySql 數據庫  實例:

首先在 MySql 中的 test 數據庫中創建一個表 “ tb_user ” ,包含兩列 “ id ”,“ name ”

CREATE TABLE `tb_user` (
`id`  int NOT NULL AUTO_INCREMENT ,
`name`  char(255) NOT NULL ,
PRIMARY KEY (`id`)
);


JDBC 程序源碼:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBC {

	public static void main(String[] args) {

		// 連接MySql數據庫必備的三個信息:數據庫url、用戶名、密碼
		String url = "jdbc:mysql://localhost:3306/test";
		String user = "root";
		String pwd = "";

		Connection conn = null;
		Statement stmt = null;
		ResultSet rs = null;

		try {

			Class.forName("com.mysql.jdbc.Driver");// 加載驅動
			conn = DriverManager.getConnection(url, user, pwd);// 獲取連接

			if (!conn.isClosed()) {
				System.out.println("成功連接mysql數據庫");

				stmt = conn.createStatement();// 創建sql描述的代表對象
				String sql = "select * from tb_user";
				rs = stmt.executeQuery(sql);// 執行sql並返回結果集

				while (rs.next()) {
					int id = rs.getInt("id");
					String name = rs.getString("name");

					System.out.println(id + " " + name);
				}

			}

		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {// 關閉資源
			if (rs != null) {
				try {
					rs.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
			if (stmt != null) {
				try {
					stmt.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
			if (conn != null) {
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
	}
}


因爲每次使用 JDBC 操作數據庫的時候,很多代碼都是不變的,所以,在學習做項目的時候,我們一般會把 JDBC 中 “獲取連接” 和 “釋放資源” 這部分不變的代碼抽象出來,封裝成一個工具類 JDBCUtil :

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBCUtil {

	public static final String DB_URL = "jdbc:mysql://localhost:3306/test";
	public static final String DB_NAME = "root";
	public static final String DB_PWD = "";

	static {
		try {
			Class.forName("com.mysql.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 取得連接
	 * 
	 * @return
	 */
	public static Connection getConnection() {
		try {
			return DriverManager.getConnection(DB_URL, DB_NAME, DB_PWD);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 釋放資源
	 * 
	 * @param rs
	 * @param stmt
	 * @param conn
	 */
	public static void free(ResultSet rs, Statement stmt, Connection conn) {
		if (rs != null) {
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if (stmt != null) {
			try {
				stmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if (conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
}


在 Java 程序中,我們使用如下語句 “獲取連接”,“釋放資源”

conn = JDBCUtil.getConnection();
JDBCUtil.free(rs, stmt, conn);

結合 JDBCUtil 類,上面的 “JDBC 連接 MySql 數據庫 實例" 就可以改寫成如下形式

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBC {

	public static void main(String[] args) {
		
		Connection conn = null;
		Statement stmt = null;
		ResultSet rs = null;
		
		try {
			conn = JDBCUtil.getConnection();
			stmt = conn.createStatement();
			rs = stmt.executeQuery("select * from tb_user");

			while (rs.next()) {
				int id = rs.getInt("id");
				String name = rs.getString("name");

				System.out.println(id + " " + name);
			}

		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			JDBCUtil.free(rs, stmt, conn);
		}
	}
}


值得注意的是:JDBC 釋放資源的時候,應該遵循 ”先打開的資源後釋放,後得到的資源先釋放“ 的原則,因爲 stmt 是由 conn 得到的,rs 又是由 stmt 得到的,爲了確保資源能夠正確的釋放,所以先釋放 rs ,再釋放 stmt ,最後釋放 conn 。
發佈了143 篇原創文章 · 獲贊 19 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章