之前一直都在用数据库的驱动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:此文为博主原创,未经允许不得转载。