JDBC源碼解析

整個過程

        String driver = "com.mysql.jdbc.Driver";
        String url = "jdbc:mysql://localhost:3306/blog?..........";
        String username = "root";
        String password = "wanghao";
        Connection conn = null;
        try {
            Class.forName(driver);
            conn = (Connection) DriverManager.getConnection(url, username, password);
            PreparedStatement ps = conn.prepareStatement("select * from blogdemo");
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                Integer id = rs.getInt("ID");
                System.out.println("id:" + id);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

1 、 driver 通過 Class.forName 方式,實際加載的是 mysql-connector-java.jar下面 com.mysql.jdbc.Driver的類.
2 、 通過 DriverManager 獲取到connection,此時的 connection是 jdk 的sql包下面的接口,具體實現在 mysql-connector-java.jar 裏面 com.mysql.fabric.jdbc.FabricMySQLDriver,在 mysql-connector-java.jar 裏面 META-INF 下,有一個文件,寫明瞭 com.mysql.fabric.jdbc.FabricMySQLDriver,所以 在 使用 DriverManager 的時候,返回的connection一定是 導入包下關於 connection的具體實現類,返回一個接口封裝。
3、返回的 connection 實際是 第三方實現的一個connection的一個實例,然後調用 prepareStatement ,獲取到 ps,在調用 executeQuery,這裏實際上是將整個語句封裝成一個固定形式的 命令 command,通過 IO 的方式與 數據庫實例發生進程通信,這樣將數據傳輸過去。

類圖

在這裏插入圖片描述

在這裏插入圖片描述## class.forName時序圖:
在這裏插入圖片描述
在這裏插入圖片描述

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