標籤:
之前一直都在用資料庫的驅動jar包,卻沒有仔細看過。只知道Class.forName();去裝載驅動類。
今天無意間想到Class.forName();不就是裝載類嘛,難道引用的jar包裡的類不會在虛擬機器啟動的時候被直接裝載嘛?
然後寫了點代碼做了測試:
1 package com.mariadb.test; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.ResultSet; 6 import java.sql.SQLException; 7 import java.sql.Statement; 8 //import org.mariadb.jdbc.Driver; 9 10 public class Test {11 public static void main(String[] args) throws ClassNotFoundException,12 SQLException {13 // Class.forName("org.mariadb.jdbc.Driver"); //在新版的驅動包裡有個檔案取代了這句話的作用14 15 Connection conn = DriverManager16 .getConnection("jdbc:mariadb://localhost:3306/test?user=root&password=bdqn");17 18 Statement statement = conn.createStatement();19 20 ResultSet rs = statement.executeQuery("SELECT * FROM `tb1`");21 22 while (rs.next()) {23 System.out.println(rs.getInt(1) + "\t" + rs.getString(2));24 }25 }26 }
然後測試結果是即使不使用Class.forName();程式依舊可以正常讀取資料庫的資料,所以暫時認為jar包裡的類會被裝載。
但是又覺得不太對,如果我一個項目引用了非常多的jar包豈不是啟動非常慢嘛。
然後去問問問別人,都說是jar包裡的類只有在被用到的時候才載入。
但是有又如何解釋驅動jar包裡的Driver類中的靜態代碼塊被執行的問題呢。
終於查到有關於驅動jar包這種現象的解釋。
所以如果使用JDBC 4.0以上的版本,類似的檔案存在, Class.forName();這一步可以省略。該檔案的內容為本jar包中的驅動類的全名。
ps:此文為博主原創,未經允許不得轉載。
一個關於java資料庫驅動包的小發現