什么是'Class.forName(“org.sqlite.JDBC”);'做?

时间:2011-07-18 23:25:11

标签: java sqlite jdbc

我正在尝试使用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();
}
  }

2 个答案:

答案 0 :(得分:26)

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

  

让我们看看为什么需要Class.forName()将驱动程序加载到内存中。所有JDBC驱动程序都有一个静态块,它使用DriverManager注册自己,而DriverManager只有静态初始化程序。

     

MySQL JDBC Driver有一个静态初始化程序,如下所示:

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

JVM执行静态块,驱动程序使用DriverManager注册自己。

     

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

答案 1 :(得分:1)

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

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