【问题标题】:What does 'Class.forName("org.sqlite.JDBC");' do?'Class.forName("org.sqlite.JDBC");' 是什么意思做?
【发布时间】:2011-10-08 02:37:53
【问题描述】:

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

以下代码取自上述网站。 我的问题是关于 public static void main 之后的行...

上面写着: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();
}
  }

【问题讨论】:

标签: java sqlite jdbc


【解决方案1】:

它动态加载一个类。 What does Class.forname method do? 是一篇关于它的好文章,它还解释了为什么数据库驱动程序需要它:

让我们看看为什么需要 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 执行静态块,Driver 向 DriverManager 注册自己。

您需要一个数据库连接来操作数据库。为了创建与数据库的连接,DriverManager 类必须知道您要使用哪个数据库驱动程序。它通过遍历已注册的驱动程序数组(内部是一个 Vector)并在数组中的每个驱动程序上调用 acceptURL(url) 方法来实现这一点,有效地要求驱动程序告诉它它是否可以处理 JDBC网址。

【讨论】:

  • 好答案。还值得注意的是 Class.forName(...) 机制不再是首选机制。 “现代化” JDBC 驱动程序在 jar 中的“META-INF/java.sql.Driver”中有一个文件,DriverManager looks for 用于自动发现驱动程序实现。不幸的是,SQLLite 没有这个文件。
  • 我记得在 Xerial SQLite 驱动程序的邮件列表上看到了一些关于添加 META-INF/services/java.sql.Driver 文件的讨论,但我仍然没有看到该文件已签入项目的源代码树。 xerial.org/trac/Xerial/wiki/SQLiteJDBC
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2015-01-04
    • 2011-07-12
    • 2012-12-22
    • 1970-01-01
    • 2011-12-27
    • 2017-09-12
    • 2013-10-31
    • 2012-03-05
    • 1970-01-01
    相关资源
    最近更新 更多