开发者社区> 问答> 正文

java中连接mysql时添加Class.forName("com.mysql.jdbc.Drive

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")的作用是什么?

"

展开
收起
因为相信,所以看见。 2020-05-27 09:59:45 1247 0
1 条回答
写回答
取消 提交回答
  • 阿里,我所有的向往

    "

    这个问题翻一下两个类的源码就可以很清楚的了解了。
    不过首先你的明白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包里可以找到

    ######

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

    ######

    知道是加载哪一个类

    ######

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

    "
    2020-05-27 16:27:22
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载

相关镜像