【JDBC】JDBC的基本使用步驟(清晰完美版)

JDBC的操作五大步驟:註冊驅動;建立連接;創建statement去執行sql,獲得結果;處理結果;釋放資源。就是這麼簡簡單單的五步,闡釋了Java連接數據庫時的優雅。

啥是JDBC

JDBC全稱: Java Data Base Connectivity,Java 數據庫連接

爲什麼會出現JDBC?

  • 對於Java這門編程語言來說,它可能需要連接各種數據庫(MySQL、SQL Server、Oracle等等);
  • 那麼對於這些數據庫廠商來說,他們都需要提供一套Java程序員能看懂的操作API;
  • 這對於程序員來說,可謂是不小的難度。因爲,當你連接MySQL時用的是一套API,當你連接Oracle時,又用的是另外一套API,十分蛋疼
  • 於是SUN公司就想能不能程序員只用一套API,就可以操作所有的數據庫。(皆大歡喜。
  • 於是,就誕生了JDBC這門規範、技術,程序員使用SUN公司提供的API,就可以操作所有的數據庫,至於其他的,就是SUN公司的事了~~

在這裏插入圖片描述

JDBC的工作原理示意圖

註冊驅動

接下來,我將使用Java來連接MySQL數據庫。學習JDBC的基礎用法。

第0步:首要步驟!!
導入驅動包:

  • 在當前項目根目錄下建立一個“lib”文件夾;
  • 把“mysql-connector-java-5.1.18-bin.jar”複製到該文件夾中;
  • 選中該jar包,右鍵,執行“build Path”才能真正導入該jar包。纔可以開始執行以下的步驟!
    在這裏插入圖片描述
導入驅動成功

爲什麼要導入這個jar包?

  • 有了這個包,你纔可以愉快地使用JDBC操作MySQL數據庫。
  • 裏面提供了MySQL的實現類:com.mysql.jdbc.Driver
  • 但是要注意,JDBC規範定義驅動接口在java.sql.Driver,也就是你要操作數據庫的所有方法都要在這個包下查找。

註冊驅動法一:創建驅動對象

快速理解連接操作方式:

import com.mysql.jdbc.Driver;
import java.util.Properties;
import java.sql.Connection;
import java.sql.SQLException;

public class TempMain {
	// 連接數據庫URL格式爲:jdbc協議:數據庫子協議:主機:端口/連接的數據庫名
	// 和HTTP協議類似
	private static String url = "jdbc:mysql://localhost:3306/mydb";
	private static String user = "root";// 用戶名
	private static String password = "root";// 密碼
	
	//第一種方法:使用驅動程序去連接
	public static void main(String[] args) throws SQLException {
			//1.創建驅動程序類對象:
			//new不能是接口,而是實現類;實現類(要導包)在:com.mysql.jdbc.Driver裏;
			Driver driver = new com.mysql.jdbc.Driver(); //新版本
			//Driver driver = new org.gjt.mm.mysql.Driver(); //舊版本
			
			//設置用戶名和密碼
			Properties props = new Properties();
			props.setProperty("user", user);
			props.setProperty("password", password);
			
			//2.連接數據庫,返回連接對象
			Connection conn = driver.connect(url, props);
			System.out.println(conn);
			//輸出:com.mysql.jdbc.JDBC4Connection@ba4d54,表明連接成功
	}
}

分析:
JDBC的URL格式:
在這裏插入圖片描述
JDBC規定url的格式由三部分組成,每個部分中間使用冒號分隔。

  1. 第一部分是jdbc,這是固定的;
  2. 第二部分是數據庫名稱,那麼連接mysql數據庫,第二部分當然是mysql了;
  3. 第三部分是由數據庫廠商規定的,我們需要了解每個數據庫廠商的要求,mysql的第三部分分別由數據庫服務器的IP地址(localhost)、端口號(3306),以及DATABASE名稱(mydb)組成。

如果連接的是本地的Mysql數據庫,並且連接使用的端口是3306,那麼的url地址可以簡寫爲:

jdbc: mysql://數據庫,
例如:jdbc: mysql://localhost:3306/mydb

註冊驅動法二: 使用驅動管理器類連接數據庫

快速理解使用方式

import com.mysql.jdbc.Driver;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class TempMain {
	// 連接數據庫URL格式爲:jdbc協議:數據庫子協議:主機:端口/連接的數據庫名
	// 和HTTP協議類似
	private static String url = "jdbc:mysql://localhost:3306/mydb";
	private static String user = "root";// 用戶名
	private static String password = "root";// 密碼

	// 第二種方法:使用驅動管理器類連接數據庫
	public static void main(String[] args) throws SQLException {
		Driver driver = new com.mysql.jdbc.Driver();
		// Driver driver2 = new com.oracle.jdbc.Driver(); //Oracle數據庫的連接

		// 1.註冊驅動程序(可以註冊多個驅動程序)
		DriverManager.registerDriver(driver);
		// DriverManager.registerDriver(driver2);
		//注意,通過查詢驅動包中的Driver類的源碼可知:該類的static代碼塊中已經執行了“DriverManager.registerDriver(driver);”,那麼這就相當於註冊了兩次,冗餘了

		// 2.連接到具體的數據庫
		Connection conn = DriverManager.getConnection(url, user, password);
		System.out.println(conn);
		//輸出:com.mysql.jdbc.JDBC4Connection@31b7dea0;表明連接成功
	}
}

不推薦使用這種註冊方式:

  1. 硬編碼,後期不易於程序擴展和維護
  2. 通過查詢驅動包中的Driver類的源碼可知:該類的static代碼塊中已經執行了“DriverManager.registerDriver(driver);”,那麼這就相當於註冊了兩次,也就是在內存中會有兩個Driver對象,冗餘了
  3. 程序依賴mysql的api,脫離mysql的jar包,程序將無法編譯,將來程序切換底層數據庫將會非常麻煩。

註冊驅動法三: 使用加載驅動程序類來註冊驅動程序

快速理解使用方式

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

public class TempMain {
	// 連接數據庫URL格式爲:jdbc協議:數據庫子協議:主機:端口/連接的數據庫名
	// 和HTTP協議類似
	private static String url = "jdbc:mysql://localhost:3306/mydb";
	private static String user = "root";// 用戶名
	private static String password = "root";// 密碼

	// 第三種方法:使用驅動管理器類連接數據庫
	public static void main(String[] args) throws SQLException, ClassNotFoundException {
		// 1.通過得到字節碼對象的方式加載靜態代碼塊,從而註冊驅動程序
		Class.forName("com.mysql.jdbc.Driver"); // 參數是字節碼

		// 2.連接到具體的數據庫
		Connection conn = DriverManager.getConnection(url, user, password);
		System.out.println(conn);
		//輸出:com.mysql.jdbc.JDBC4Connection@50675690,表明連接成功
	}
}

底層原理:

  • 通常開發我們使用Class.forName() 加載一個使用字符串描述的驅動類。
  • 如果使用Class.forName()將類加載到內存,該類的靜態代碼將自動執行
  • 通過查詢com.mysql.jdbc.Driver源碼,我們發現Driver類“主動”將自己進行註冊
  • 結論:推薦使用

建立連接

方法1:創建驅動對象

Driver driver = new com.mysql.jdbc.Driver(); //若new驅動對象
Connection conn = driver.connect(url, props); //則必須使用這種建立連接

方法2:使用加載驅動程序類來註冊驅動程序

Class.forName("com.mysql.jdbc.Driver"); //加載驅動對象
Connection conn = DriverManager.getConnection(url, user, password); //加載獲取連接
  • Connection是接口,DriverManager.getConnection()返回的是com.mysql.jdbc.JDBC4Connectiond的實現類。

Connection類的API詳解

  • createStatement():創建向數據庫發送sql的statement對象。
  • prepareStatement(sql) :創建向數據庫發送預編譯sql的PrepareSatement對象。
  • prepareCall(sql):創建執行存儲過程的callableStatement對象。
  • setAutoCommit(boolean autoCommit):設置事務是否自動提交。
  • commit() :在鏈接上提交事務。
  • rollback() :在此鏈接上回滾事務。

DriverManager類功能詳解

  1. DriverManager在JDBC規範中是類而不是接口。它是一個服務類,用於管理JDBC驅動程序,提供getConnection()方法建立應用程序與數據庫的連接
  2. getConnection()是個靜態方法。返回的是com.mysql.jdbc.JDBC4Connectiond的實現類。打印“conn”變量內容爲:“com.mysql.jdbc.JDBC4Connectiond”
  3. DriverManager在java.sql包中。當我們調用sql包裏不論什麼一個類(包含接口)的不論什麼一個方法時都會報一個編譯時異常SQLException

創建statement去執行sql,獲得結果

類型:
1、運行靜態SQL語句。通常通過Statement實例實現。
2、運行動態SQL語句。通常通過PreparedStatement實例實現。
3、運行數據庫存儲過程。通常通過CallableStatement實例實現。

測試用的mysql語句

CREATE DATABASE mydb;

USE mydb;

CREATE TABLE person(
	p_id INT PRIMARY KEY,
	p_name VARCHAR(10),
	p_age INT
);

INSERT INTO person(p_id,p_name,p_age) VALUES
	(1,"asus",20),
	(2,"alibaba",40),
	(3,"huawei",50)

靜態SQL:Statement

特性:

  1. java.sql.Statement接口,所有的操作方法也來自該接口;
  2. 在每次使用時,都是用“com.mysql.jdbc”包中的類來返回“java.sql.Statement”接口的引用

Statement接口提供了三種運行SQL語句的方法:executeQuery、executeUpdate 和execute。

  1. ResultSet executeQuery(String sqlString):運行查詢數據庫的SQL語句。返回一個結果集(ResultSet)對象。
  2. int executeUpdate(String sqlString):用於運行INSERT、UPDATE或DELETE語句以及SQL DDL語句,如:CREATETABLE和DROP TABLE等。返回影響作用的行數。
  3. boolean execute(sqlString):用於運行返回多個結果集、多個更新計數或二者組合的語句。
  4. ddBatch(String sql):把多條sql語句放到一個批處理中。
  5. executeBatch():向數據庫發送一批sql語句執行。

學習例子:
https://github.com/Kyle-Shawe/JavaEE-Study-Notes/tree/master/01-JDBC/03-%E9%9D%99%E6%80%81SQL(Statement)%E7%9A%84CRUD

動態SQL:PreparedStatement

特性:

  1. 是“java.sql.Statement”接口的子接口
  2. 這個接口的實現類,在數據庫的驅動中:“com.mysql.jdbc. JDBC4PreparedStatement”

方法詳情:

  • int executeUpdate(); 執行PreparedStatement對象中預編譯的SQL語句。返回執行成功的行數。 適用執行:insert、update、delete類的SQL語句;
  • executeQuery方法,適用於執行有返回結果集的SQL語句,例如select。

學習例子:
https://github.com/Kyle-Shawe/JavaEE-Study-Notes/tree/master/01-JDBC/04-%E5%8A%A8%E6%80%81SQL(PreparedStatement)%E7%9A%84CURD

處理結果

獲取方法:

  • Object getObject(int index) / Object getObject(String name) 獲得任意對象
  • String getString(int index) / Object getObject(String name) 獲得字符串
  • int getInt(int index) / Object getObject(String name) 獲得整形
  • double getDouble(int index) / Object getObject(String name) 獲得雙精度浮點型

遍歷方法:

  • boolean next(); 將光標移動至下一行。當光標返回最後一行之後一行,或者爲空,返回false。
  • Previous():移動到前一行
  • absolute(int row):移動到指定行
  • beforeFirst():移動resultSet的最前面。
  • afterLast() :移動到resultSet的最後面。

釋放資源

操作完畢以後要把全部使用的JDBC對象全都關閉,以釋放JDBC資源。關閉順序和聲明順序相反
1、關閉記錄集
2、關閉聲明
3、關閉連接對象

關閉資源SOP:

	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();
		}
	}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章