整個過程
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時序圖: