JDBC-1(概述&建立)
基於宋紅康老師所講JDBC所作筆記
1.JDBC概述
1.1 數據持久化
- 持久化:將數據保持到可掉電式存儲設備中以供之後使用。
數據持久化意味著將記憶體中的數據保存到硬碟上加以固化,實現過程大多通過各種關係資料庫完成。
主要應用:將記憶體中的數據存儲在關係型資料庫中(也可存儲於磁碟文件、XML數據文件中)
1.2 Java中的數據存儲技術
- JDBC直接訪問資料庫
- JDO(Java Data Object)技術
- 第三方O/R工具(Mybatis)
1.3 JDBC介紹
- JDBC(Java Database Connectivity)獨立於特定資料庫管理系統,通用的SQL資料庫存取和操作的公共介面(一組API),定義了用來訪問資料庫的標準Java類庫
- JDBC為訪問不同資料庫提供了統一的途徑,屏蔽了一些細節問題
- JDBC的目標是使Java程式設計師使用JDBC鏈接任何提供了JDBC驅動程式的資料庫系統,使程式設計師無需對特定資料庫系統特點有過多了解,簡化加快開發過程。
1.4 JDBC體系結構
- JDBC介面(API)包括兩個層次:
- 面嚮應用的API:Java API,抽象介面,供程式開發人員使用(鏈接資料庫,執行SQL語句,獲得結果)
- 面向資料庫的API:Java Driver API,供開發商開發資料庫驅動程式
2.JDBC連接
2.1 Driver
2.1.1 Driver介面簡介
- java.sql.Driver介面是所有JDBC驅動程式需要實現的介面,該介面提供給資料庫廠商使用,不同資料庫廠商提供不同實現。
- 程式中不需直接訪問Driver介面實現類,由驅動程式管理器類調用這些類
- MySQL:com.mysql.cj.jdbc.Driver(引入jar包為8.0版本)
2.1.2 載入與註冊JDBC
2.2 URL(統一資源定位符)
- URL用於標識一個被註冊的驅動程式,驅動程式管理器通過這個URL選擇正確的驅動程式從而建立到資料庫的連接。
- URL由三部分組成 jdbc:子協議:子名稱
String url = "jdbc:mysql://localhost:3306/user_db?serverTimezone=UTC";
- 協議 jdbc
- 子協議:mysql
- 一種標識資料庫的方法。子名稱可以依不同的子協議而變化,用子名稱的目的是為了定位資料庫提供足夠的資訊。包含主機名(對應服務端的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
優勢:
- 實現數據和程式碼的分離,降低程式耦合度
- 如果需要修改配置文件資訊,可避免程式重新打包