Class.forName()是什么意思

use*_*001 3 java mysql class jdbc

我正在学习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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Mur*_*nik 9

Class.forName创建java.lang.Class与给定名称对应的实例.这会强制类加载器加载此类,并在其static块中执行任何代码.

较旧的JDBC驱动程序曾经使用这些静态块将自己注册到java.sql.DriverManager它们,以便以后可以使用它们连接到数据库.JDBC 4是Java 6的一部分,它引入了一种自动加载JDBC驱动程序的机制,因此不再需要它.


Tho*_*mas 5

Class.forName("com.mysql.jdbc.Driver") 将通过反射获取命名类的类对象。

如果该类存在,则代码中是否包含该行没有区别,您不会对返回值执行任何操作。但是,如果它在类路径上不存在,您将从该调用中得到一个异常,因此您会知道驱动程序丢失而不是连接失败。

假设 MySQL 驱动程序不存在于类路径中。

如果没有该语句,您可能会出现“无法打开连接”之类的错误,您可能需要解析日志并查找原因。

如果调用该语句,您将得到一个ClassNotFoundException,因此您将知道问题的原因:类加载器未找到驱动程序类。

编辑:阅读@Mureinik 的回答,这可能是该声明的更好理由。:)