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

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


元芳怎么了
浏览 738回答 4
4回答

慕码人8056858

这个问题翻一下两个类的源码就可以很清楚的了解了。不过首先你的明白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中了,这样整个流程就全部通了。综上,不懂得问题翻翻代码就清楚了,多动手。

梦里花落0921

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

哔哔one

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

繁花不似锦

通过反射机制加载数据库驱动类。不然谁知道你链接的是哪个数据库啊。。。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java