为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

元芳怎么了 2019-03-04 12:15:30
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")的作用是什么?
查看完整描述

4 回答

?
慕码人8056858

TA贡献1803条经验 获得超6个赞

这个问题翻一下两个类的源码就可以很清楚的了解了。

不过首先你的明白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中了,这样整个流程就全部通了。


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


查看完整回答
反对 回复 2019-04-16
?
梦里花落0921

TA贡献1772条经验 获得超6个赞

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


查看完整回答
反对 回复 2019-04-16
?
哔哔one

TA贡献1854条经验 获得超8个赞

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

查看完整回答
反对 回复 2019-04-16
?
繁花不似锦

TA贡献1851条经验 获得超4个赞

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

查看完整回答
反对 回复 2019-04-16
  • 4 回答
  • 0 关注
  • 736 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号