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 的方式与 数据库实例发生进程通信,这样将数据传输过去。

类图

JDBC源码解析

JDBC源码解析## class.forName时序图:
JDBC源码解析
JDBC源码解析