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时序图: