基於宋紅康老師所講JDBC所作筆記

1.JDBC概述

1.1 資料持久化

  • 持久化:將資料保持到可掉電式儲存裝置中以供之後使用。

    資料持久化意味著將記憶體中的資料儲存到硬碟上加以固化,實現過程大多通過各種關係資料庫完成。

主要應用:將記憶體中的資料儲存在關係型資料庫中(也可儲存於磁碟檔案、XML資料檔案中)

1.2 Java中的資料儲存技術

  1. JDBC直接訪問資料庫
  2. JDO(Java Data Object)技術
  3. 第三方O/R工具(Mybatis)

1.3 JDBC介紹

  • JDBC(Java Database Connectivity)獨立於特定資料庫管理系統,通用的SQL資料庫存取和操作的公共介面(一組API),定義了用來訪問資料庫的標準Java類庫
  1. JDBC為訪問不同資料庫提供了統一的途徑,遮蔽了一些細節問題
  2. JDBC的目標是使Java程式設計師使用JDBC連結任何提供了JDBC驅動程式的資料庫系統,使程式設計師無需對特定資料庫系統特點有過多瞭解,簡化加快開發過程。

1.4 JDBC體系結構

  • JDBC介面(API)包括兩個層次:

    1. 面向應用的API:Java API,抽象介面,供程式開發人員使用(連結資料庫,執行SQL語句,獲得結果)
    2. 面向資料庫的API:Java Driver API,供開發商開發資料庫驅動程式

2.JDBC連線

2.1 Driver

2.1.1 Driver介面簡介

  1. java.sql.Driver介面是所有JDBC驅動程式需要實現的介面,該介面提供給資料庫廠商使用,不同資料庫廠商提供不同實現。
  2. 程式中不需直接訪問Driver介面實現類,由驅動程式管理器類呼叫這些類
    • MySQL:com.mysql.cj.jdbc.Driver(引入jar包為8.0版本)

2.1.2 載入與註冊JDBC

2.2 URL(統一資源定位符)

  1. URL用於標識一個被註冊的驅動程式,驅動程式管理器通過這個URL選擇正確的驅動程式從而建立到資料庫的連線。
  2. URL由三部分組成 jdbc:子協議:子名稱 String url = "jdbc:mysql://localhost:3306/user_db?serverTimezone=UTC";
    1. 協議 jdbc
    2. 子協議:mysql
    3. 一種標識資料庫的方法。子名稱可以依不同的子協議而變化,用子名稱的目的是為了定位資料庫提供足夠的資訊。包含主機名(對應服務端的ip地址),埠號,資料庫名

注:jdbc:mysql://localhost:3306/atguigu?useUnicode=true&characterEncoding=utf8(如果JDBC程式與伺服器端的字符集不一致,會導致亂碼,那麼可以通過引數指定伺服器端的字符集)

2.3 使用者名稱和密碼

  • user,password可以用“屬性名=屬性值”方式告訴資料庫
  • 可以呼叫 DriverManager 類的 getConnection() 方法建立到資料庫的連線

2.4 資料庫連線方式舉例

方式一

點選檢視程式碼
public class ConnectionTest {

    @Test
public void testConnection1() throws SQLException {
Driver driver = new com.mysql.cj.jdbc.Driver();
//jdbc:mysql 協議
//localhost: ip地址
//3306:預設mysql埠號; test:資料庫
String url = "jdbc:mysql://localhost:3306/user_db?serverTimezone=UTC"; //統一資源定位符 //將使用者名稱和密碼封裝在此
Properties info = new Properties();
info.setProperty("user", "root");
info.setProperty("password", "root");
Connection connection = driver.connect(url, info);
System.out.println(connection);
}
}

方式二:不出現第三方API,使程式具有更好可移植性

點選檢視程式碼
    @Test //2禁止第三方迭代
public void testConnection2() throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
//1.用反射實現獲取Driver實現類物件
Class clazz = Class.forName("com.mysql.cj.jdbc.Driver");
Driver driver = (Driver) clazz.newInstance(); //2.提供要連線的資料庫
String url = "jdbc:mysql://localhost:3306/user_db?serverTimezone=UTC"; //3.提供連線需要的使用者名稱和密碼
Properties info = new Properties();
info.setProperty("user", "root");
info.setProperty("password", "root"); //4.獲取連結
Connection connection = driver.connect(url, info);
System.out.println(connection);
}

方式三:使用DriverManager替換Driver

點選檢視程式碼
    @Test //3使用DriverManager替代Driver
public void testConnection3() throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
//1.使用DriverManager替代Driver
Class clazz = Class.forName("com.mysql.cj.jdbc.Driver");
Driver driver = (Driver) clazz.newInstance(); //2.提供要連線的資料庫
String url = "jdbc:mysql://localhost:3306/user_db?serverTimezone=UTC"; //3.提供連線需要的使用者名稱和密碼
Properties info = new Properties();
info.setProperty("user", "root");
info.setProperty("password", "root"); //註冊驅動
DriverManager.registerDriver(driver); //獲取連線
//4.獲取連結
Connection connection = DriverManager.getConnection(url, info);
System.out.println(connection);
}

方式四:

點選檢視程式碼
    @Test //4 相較於方式三省略類的顯式載入流程(與MySQL Driver實現類靜態程式碼塊有關)
public void testConnection4() throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
//1.獲取三個連線的基本資訊
String url = "jdbc:mysql://localhost:3306/user_db?serverTimezone=UTC";
String user = "root";
String password = "root"; //2.載入Driver(Driver提供了一個靜態程式碼塊,載入時自動執行)
Class.forName("com.mysql.cj.jdbc.Driver"); //3.獲取連線
Connection connection = DriverManager.getConnection(url, user, password);
System.out.println(connection.toString());
}
}

方式五:使用配置檔案載入四個配置資訊

點選檢視程式碼
    @Test //5 將資料庫連線的基本資訊配置在配置檔案中,通過讀取配置檔案的方式獲取連線
public void testConnection5() throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException, IOException { //1. 讀取配置檔案的4個配置資訊
InputStream inputStream = ConnectionTest.class.getClassLoader().getResourceAsStream("jdbc.properties");
Properties prop = new Properties();
prop.load(inputStream); String user = prop.getProperty("user");
String password = prop.getProperty("password");
String url = prop.getProperty("url");
String driverClass = prop.getProperty("driverClass"); //2.載入驅動
Class.forName(driverClass); //3.啟動連線
Connection connection = DriverManager.getConnection(url, user, password);
System.out.println(connection);
}
點選檢視配置檔案jdbc.properties
url=jdbc:mysql://localhost:3306/user_db?serverTimezone=UTC
user=root
password=root
driverClass=com.mysql.cj.jdbc.Driver

優勢:

  1. 實現資料和程式碼的分離,降低程式耦合度
  2. 如果需要修改配置檔案資訊,可避免程式重新打包