首页 > java中连接mysql时添加Class.forName("com.mysql.jdbc.Driver")的作用?

java中连接mysql时添加Class.forName("com.mysql.jdbc.Driver")的作用?

java连接mysql数据库时总是报错:

try {
       connection = DriverManager.getConnection(url, username, password);
} catch (Exception e) {
       e.printStackTrace();
}

错误信息是:java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306

但加上Class.forName("com.mysql.jdbc.Driver")后就能正常运行:

try {
       Class.forName("com.mysql.jdbc.Driver");
       connection = DriverManager.getConnection(url, username, password);
} catch (Exception e) {
       e.printStackTrace();
}

Class.forName("com.mysql.jdbc.Driver")的作用是什么?


class.forName("com.mysql.jdbc.Driver")会在classpath中查找并加载这个类。一旦com.mysql.jdbc.Driver被加载并连接后,就自动执行static静态代码块,这时就可以做一些初始化的工作了,最主要的作用就是执行java.sql.DriverManager.registerDriver()来注册驱动。如果没有class.forName这一步,就会报找不到合适的驱动程序。


通过反射机制加载数据库驱动类。
不然谁知道你链接的是哪个数据库啊。。。


这个问题翻一下两个类的源码就可以很清楚的了解了。
不过首先你的明白Class.forName()的作用,这个是用来加载指定类的。
为什么需要手动去加载呢?正常情况下对于一个Java程序来说我们不需要去管某个类的加载,只需要在用来的时候import进去即可,但是对于JDBC的设计是不一样的,你可以从你的数据库连接代码中发现,DriverManage在决定使用哪个驱动的时候并不是由开发者指定的,而是通过遍历所有已注册的驱动来尝试获取连接,成功就返回,失败就next,所以代码中并没有显示的指定驱动,这一点可以从DriverManage的源码中可以看到。

for(DriverInfo aDriver : registeredDrivers) {
    // If the caller does not have permission to load the driver then
    // skip it.
    if(isDriverAllowed(aDriver.driver, callerCL)) {
        try {
            println("    trying " + aDriver.driver.getClass().getName());
            Connection con = aDriver.driver.connect(url, info);
            if (con != null) {
                // Success!
                println("getConnection returning " + aDriver.driver.getClass().getName());
                return (con);
            }
        } catch (SQLException ex) {
            if (reason == null) {
                reason = ex;
            }
        }
    } else {
        println("    skipping: " + aDriver.getClass().getName());
    }
}

这个类基本可以明白JDBC是如何获取连接的,问题是registeredDrivers是怎么来的,从DriverManager的源码中只能够发现一个registerDriver方法可以往registeredDrivers中注册驱动,所以自然是由驱动类自行将自己注册到registeredDrivers中,这一点可以通过查看com.mysql.jdbc.Driver类源码得到证实。

    //
    // Register ourselves with the DriverManager
    //
    static {
        try {
            java.sql.DriverManager.registerDriver(new Driver());
        } catch (SQLException E) {
            throw new RuntimeException("Can't register driver!");
        }
    }

这个是jdbc.Driver的一段static代码,这段代码在类加载时会自动执行,所以就把自己注册到DriverManage的registerDriver中了,这样整个流程就全部通了。


综上,不懂得问题翻翻代码就清楚了,多动手。


加载驱动用的。forName方法的参数是一个类的包名加类名,这个类在MySQL驱动的jar包里可以找到


知道是加载哪一个类

【热门文章】
【热门文章】