我正在学习JDBC,唯一我得不到的是下面代码中的类Class。
我是否删除Class.forName("com.mysql.jdbc.Driver")
,它是否正常工作。
你能解释一下这部分中的Class.forName(“com.mysql.jdbc.Driver”)是什么函数吗?
import java.sql.*;
public class JSP {
public static void main(String[] args){
Connection myConn = null;
Statement st= null;
ResultSet rs= null;
try {
Class.forName("com.mysql.jdbc.Driver");
myConn = DriverManager.getConnection("jdbc:mysql://localhost:3306/customer", "root", "Gspot");
st = myConn.createStatement();
String query = "select * from customers";
rs = st.executeQuery(query);
while(rs.next()){
System.out.println(rs.getString("name"));
}
} catch(SQLException e){
e.printStackTrace();
} catch(ClassNotFoundException e) {
System.out.println("wow");
}
}
}
答案 0 :(得分:9)
Class.forName
创建与给定名称对应的java.lang.Class
实例。这会强制类加载器加载此类,并在其static
块中执行任何代码。
旧的JDBC驱动程序曾经使用这些静态块将自己注册到java.sql.DriverManager
,以便以后可以用它们连接到数据库。 JDBC 4是Java 6的一部分,它引入了一种自动加载JDBC驱动程序的机制,因此不再需要它。
答案 1 :(得分:4)
Class.forName("com.mysql.jdbc.Driver")
将通过反射获取指定类的类对象。
如果该类存在,那么在代码中使用该行之间没有区别,那么您不会对返回值执行任何操作。但是,如果它没有存在于类路径中,那么您将从该调用中获得异常,因此您知道驱动程序丢失而不是连接失败。
假设类路径中没有MySQL驱动程序。
如果没有该声明,您可能会出现错误,例如"无法打开连接"并且你可能需要解析日志并查找原因。
如果调用该语句,您将获得ClassNotFoundException
,因此您就知道问题的原因:类加载器找不到驱动程序类。
编辑:阅读@ Mureinik的回答,这可能是该声明的更好理由。 :)
答案 2 :(得分:1)
我建议你阅读本文:Understanding-ClassforName-Java
如果您正在调用Class.forName("com.mysql.jdbc.Driver");
,则驱动程序类 com.mysql.jdbc.Driver 将被加载到内存中。每个这样的驱动程序类都有这样的静态块:
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
因此,如果您正在加载该类,则会自动调用静态块,驱动程序将会(如果成功)注册。
答案 3 :(得分:0)
根据文件(http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#forName(java.lang.String)):
对forName(“X”)的调用会导致名为X的类被初始化。
表示从磁盘加载类,并调用其静态初始值设定项,例如:
public class Test {
private static final int a;
static { // called when the class is loaded via forName or any other loading mechanism
a = 5;
doSomething(a);
}
private static int doSomething(int x) {
return (x+5);
}
}
这只在加载类时发生一次。例如,在您的情况下,我们可以假设它允许驱动程序运行代码以将自身注册到JDBC中。
如果省略此调用不会改变运行时行为,则意味着该类之前已经加载过。