JDBC-1(概述&建立)

基於宋紅康老師所講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. 如果需要修改配置文件資訊,可避免程式重新打包
Tags: