之前一直都在用数据库的驱动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 = DriverManager 16 .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:此文为博主原创,未经允许不得转载。
时间: 2024-12-25 07:09:33