Spring-JDBC 源碼學習(0) —— 概覽

概覽

在學習 Spring-JDBC 之前,我們有必要從 Java 原生提供的 JDBC 開始,對 JDBC 操作的一整套完整的流程有一個清晰的概念。

/**
 * copied from https://www.tutorialspoint.com/jdbc/jdbc-sample-code.htm
 * updated by DorMOUSENone
 */

//STEP 1. 引入必須的包
import java.sql.*;

public class Example {
    // JDBC 驅動名 與 DB URL 
    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";  
    static final String DB_URL = "jdbc:mysql://<host>:<port>/<dbName>";

    // 數據庫登錄驗證 (用戶名、密碼等)
    static final String USER = "username";
    static final String PASS = "password";

    public static void main(String[] args) {
        Connection conn = null;
        Statement stmt = null;
        try{
            //STEP 2: 註冊驅動(註冊到驅動管理器 DriverManager 類中)
            Class.forName("com.mysql.jdbc.Driver");

            //STEP 3: 創建一個連接
            System.out.println("Connecting to database...");
            conn = DriverManager.getConnection(DB_URL,USER,PASS);

            //STEP 4: 執行一個查詢
            System.out.println("Creating statement...");
            stmt = conn.createStatement();
            String sql;
            sql = "SELECT id, first, last, age FROM Employees";
            ResultSet rs = stmt.executeQuery(sql);

            //STEP 5: 將結果從結果集(ResultSet)中取出
            while(rs.next()){
                //根據列名逐一取出數據
                int id  = rs.getInt("id");
                int age = rs.getInt("age");
                String first = rs.getString("first");
                String last = rs.getString("last");

                //展示結果
                System.out.print("ID: " + id);
                System.out.print(", Age: " + age);
                System.out.print(", First: " + first);
                System.out.println(", Last: " + last);
            }
            //STEP 6: 清理環境
            rs.close();
            stmt.close();
            conn.close();
        }catch(SQLException se){
            //處理 JDBC 錯誤
            se.printStackTrace();
        }catch(Exception e){
            //處理 Class.forName() 引起的錯誤
            e.printStackTrace();
        }finally{
            // finally 代碼庫來關閉資源
            try{
                if(stmt!=null)
                    stmt.close();
            }catch(SQLException se2){
            }// 不做任何處理
            try{
                if(conn!=null)
                    conn.close();
            }catch(SQLException se){
                se.printStackTrace();
            }
        }
        System.out.println("Goodbye!");
    }
}

從上面的通用 JDBC 代碼可以看到,利用 Java 原生提供的 java.sql.* 包可以完成註冊驅動,創建連接,執行查詢,處理結果等一系列一整套操作。

而 Spring-JDBC 對於 Java 原生提供的 JDBC ,對一系列數據及操作進行了整合:

  1. 實現了 DataSource 接口,用於整合數據源配置,將各種零散的屬性值(諸如 URL、用戶名、 密碼等)整合成完整的一個對象,便於重用;也實現了 getConnection(…) 接口,便於直接通過 DataSource 獲取連接。
  2. 對執行查詢的流程進行了封裝。
  3. 對結果集的處理提供了多種接口,針對不同的應用場景可自由選擇所必須的實現類。例如直接通過 JDBC 獲得 Bean ,而無需如上例 39-42 行所示,逐一編碼進行提取。

本節提供對《Spring-JDBC 源碼學習》完整學習過程的一個梳理:

  1. JdbcTemplate 一節作爲學習 Spring-jdbc 的切入點,是 org.springframework.jdbc.core 包中的核心類,是一個提供不同場景下數據庫操作的模板類。主要描述其持有的屬性 DataSource 等以及其實現的方法。
  2. DataSource 一節承接 JdbcTemplate 一節,提供 Spring-jdbc 對數據源的一個包裝與應用。同時描述其核心方法 getConnection(…) 的實現。
  3. DriverManager 描述其對不同數據庫供應商提供的驅動的管理與使用方法。同時簡單描述通過具體驅動獲得一個連接的實現。
  4. PreparedStatement & CallableStatement 一節主要表述 Spring-jdbc 如何對執行查詢的流程進行了封裝。特別是對於 PreparedStatement 與 CallableStatement 這類預置可變 SQL 語句,在執行前必須對其中可變參數進行補全的 Statement 。
  5. ResultSet 描述 Spring-jdbc 如何對結果集進行處理,提供了多種不同的接口實現不同的處理邏輯。這種封裝後的操作可以極大地簡化直接使用 Java 原生 JDBC 所必須的硬編碼提取數據的問題。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章