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()的作用,这个是用来加载指定类的。
为什么需要手动去加载呢?正常情况下对于一个Java程序来说我们不需要去管某个类的加载,只需要在用来的时候import进去即可,但是对于JDBC的设计是不一样的,你可以从你的数据库连接代码中发现,DriverManage在决定使用哪个驱动的时候并不是由开发者指定的,而是通过遍历所有已注册的驱动来尝试获取连接,成功就返回,失败就next,所以代码中并没有显示的指定驱动,这一点可以从DriverManage的源码中可以看到。
这个类基本可以明白JDBC是如何获取连接的,问题是registeredDrivers是怎么来的,从DriverManager的源码中只能够发现一个registerDriver方法可以往registeredDrivers中注册驱动,所以自然是由驱动类自行将自己注册到registeredDrivers中,这一点可以通过查看com.mysql.jdbc.Driver类源码得到证实。
这个是jdbc.Driver的一段static代码,这段代码在类加载时会自动执行,所以就把自己注册到DriverManage的registerDriver中了,这样整个流程就全部通了。
综上,不懂得问题翻翻代码就清楚了,多动手。