这是我的代码 - 我只是检查我的MySQL数据库连接
但首先我已成功编译并运行该程序。但后来我评论了Class.forName。
仍然当我编译它成功运行,没有任何错误。为什么?
import java.sql.Connection;
import java.sql.DriverManager;
public class FirstJbdc {
public static void main(String[] args) {
Connection cn=null;
try {
//Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
System.out.println("Driver loaded successfully");
cn=DriverManager.getConnection("jdbc:odbc:myDSN","root", "java");
System.out.println("Database connected successfully....");
System.out.println(cn);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
答案 0 :(得分:8)
我抛出一个错误,好吧。这就是
catch (Exception e){
// here the exception is instantiated, but nothing is done about it
}
子句默默地吞下你的异常。
尝试
System.out.println( e.getMessage() );
答案 1 :(得分:7)
即使不使用Class.forName,Java 1.6也可以找到JDBC驱动程序。
以下是documentation的相关部分:
DriverManager
方法getConnection
和getDrivers
已得到增强,可支持Java Standard Edition Service Provider机制。 JDBC 4.0驱动程序必须包含文件META-INF/services/java.sql.Driver
。此文件包含java.sql.Driver
的JDBC驱动程序实现的名称。例如,要加载my.sql.Driver
类,META-INF/services/java.sql.Driver
文件将包含条目:my.sql.Driver
应用程序不再需要使用Class.forName()明确加载JDBC驱动程序。当前使用Class.forName()加载JDBC驱动程序的现有程序将继续工作而无需修改。
答案 2 :(得分:1)
注意:这仅适用于JDBC 4.0之前的驱动程序。
JDBC驱动程序应该有一个static
部分,在加载类时会使用java.sql.DriverManager
注册它们,因此需要Class.forName(String)
。
详情请见http://java.sun.com/j2se/1.3/docs/guide/jdbc/getstart/drivermanager.html
答案 3 :(得分:0)
尝试{
//Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
System.out.println("Driver loaded successfully");
cn=DriverManager.getConnection("jdbc:odbc:myDSN","root", "java");
System.out.println("Database connected successfully....");
System.out.println(cn);
} catch (Exception e) {
// add the following statement
System.out.println(e.getMessage());
}
如果在catch块中添加语句,然后编译并运行,您应该看到错误消息,如 -
[ Some Com ] [部分驱动程序管理器]未找到数据源名称且未指定默认驱动程序
答案 4 :(得分:0)
如果没有Class.forName()
,则不会加载JDBC-ODBC桥驱动程序。根据JDBC规范,如果没有找到URL的驱动程序,getConnection()
将返回null,不会抛出异常。所以这是预期的行为。