'Class.forName(“org.sqlite.JDBC”);' 有什么作用?

2022-09-01 17:32:35

我正在尝试使用SQLite数据库创建一个简单的应用程序。我选择使用 SQLiteJDBC 驱动程序

以下代码取自上述网站。我的问题是关于公共静态虚空主...

上面写着:Class.forName("org.sqlite.JDBC");

我的问题是,这条线是什么意思?它有什么作用?它似乎没有连接到代码的其余部分。 应该返回一个类,但这条线似乎在身体内部是独立的。无论它返回什么,我都能看到的代码的另一部分不使用。Class.forName()

请帮助澄清这一点。提前致谢。

public class Test {
 public static void main(String[] args) throws Exception {
    Class.forName("org.sqlite.JDBC");
    Connection conn =
      DriverManager.getConnection("jdbc:sqlite:test.db");
    Statement stat = conn.createStatement();
    stat.executeUpdate("drop table if exists people;");
    stat.executeUpdate("create table people (name, occupation);");
    PreparedStatement prep = conn.prepareStatement(
      "insert into people values (?, ?);");

prep.setString(1, "Gandhi");
prep.setString(2, "politics");
prep.addBatch();
prep.setString(1, "Turing");
prep.setString(2, "computers");
prep.addBatch();

conn.setAutoCommit(false);
prep.executeBatch();
conn.setAutoCommit(true);

ResultSet rs = stat.executeQuery("select * from people;");
while (rs.next()) {
  System.out.println("name = " + rs.getString("name"));
  System.out.println("job = " + rs.getString("occupation"));
}
rs.close();
conn.close();
}
  }

答案 1

它动态加载类。Class.forname 方法有什么作用?这是一篇关于它的好文章,它还解释了为什么数据库驱动程序需要它:

让我们看看为什么需要 Class.forName() 将驱动程序加载到内存中。所有 JDBC 驱动程序都有一个静态块,该块向 DriverManager 注册自身,而 DriverManager 仅具有静态初始值设定项。

MySQL JDBC 驱动程序有一个静态初始值设定项,如下所示:

static {
    try {
        java.sql.DriverManager.registerDriver(new Driver());
    } catch (SQLException E) {
        throw new RuntimeException("Can't register driver!");
    }
}

JVM 执行静态块,驱动程序向驱动程序管理器注册自身。

您需要数据库连接来操作数据库。为了创建与数据库的连接,DriverManager 类必须知道要使用的数据库驱动程序。它通过循环访问已向其注册的驱动程序的数组(内部为Vector)并在数组中的每个驱动程序上调用 acceptsURL(url)方法来实现此目的,从而有效地要求驱动程序告诉它是否可以处理 JDBC URL。


答案 2

Class.forName 语句确保为 sqlite3 实现 JDBC 驱动程序的类已加载并向 JDBC 工厂机制注册。

当您调用 DriverManager.getConnection() 时,它会查找已注册并声明能够处理连接字符串的类。如果未找到此类类,则无法创建连接。


推荐