今天無意中注釋了Class.forName("dm.jdbc.driver.DmDriver"); 反射加載驅動程式的代碼,結果程式還是能正常查詢資料庫資料進行回傳,
有點顛覆了我之前寫demo的時候會用到這個來測驗,必須要寫Class.forName("dm.jdbc.driver.DmDriver");才能正常的訪問資料,
我的測驗代碼如下:(我用的是達夢資料庫測驗的)
package org.example;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
/**
* @Description TODO
* @Author Harry
* @Date 2020/12/25 14:28
**/
public class TestDmJdbc {
public static void main(String[] args) {
Connection con = null;// 創建一個資料庫連接
PreparedStatement pre = null;// 創建預編譯陳述句物件,一般都是用這個而不用Statement
ResultSet result = null;// 創建一個結果集物件
try
{
// Class.forName("dm.jdbc.driver.DmDriver");// 加載驅動程式
System.out.println("開始嘗試連接資料庫!");
String url = "jdbc:dm://localhost:5236/GEN?useUnicode=true&characterEncoding=UTF-8";// 127.0.0.1是本機地址
String user = "GEN";// 用戶名,系統默認的賬戶名
String password = "123456789";// 你安裝時選設定的密碼
con = DriverManager.getConnection(url, user, password);// 獲取連接
System.out.println("連接成功!");
String sql = "select * from gen_test1";// 預編譯陳述句,“?”代表引數
pre = con.prepareStatement(sql);// 實體化預編譯陳述句
//pre.setString(1, "303");// 設定引數,前面的1表示引數的索引,而不是表中列名的索引
result = pre.executeQuery();// 執行查詢,注意括號中不需要再加引數
while (result.next())
// 當結果集不為空時
System.out.println("學號:" + result.getInt("id") + "姓名:"
+ result.getString("testName"));
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
try
{
// 逐一將上面的幾個物件關閉,因為不關閉的話會影響性能、并且占用資源
// 注意關閉的順序,最后使用的最先關閉
if (result != null)
result.close();
if (pre != null)
pre.close();
if (con != null)
con.close();
System.out.println("資料庫連接已關閉!");
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
}
于是出于好奇心去查了一下原始碼,翻的程序中在DriverManager類上發現了一段這樣的注釋

同時看到如下加載原始碼

原來實作驅動的第三方廠商只要按java SPI支持,就會自動注冊進驅動,所以我看到原始碼里實作的方式也是用list存放所有的驅動

這個是不同廠商的實作

以此解了我心中的疑惑!
本文由博客群發一文多發等運營工具平臺 OpenWrite 發布
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/241711.html
標籤:Java
上一篇:Java中方法的覆寫
