当前位置: 首页 > 面试题库 >

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

周枫涟
2023-03-14
问题内容

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

以下代码取自上述网站。我的问题是关于公共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();
}
  }

问题答案:

它动态加载一个类。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注册自身。

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



 类似资料:
  • 问题内容: 和之间有什么区别? 我不了解其中的重大区别(我已经阅读了一些有关它们的信息!)。请你帮助我好吗? 问题答案: 也许一个示例演示如何使用两种方法将有助于你更好地理解事物。因此,请考虑以下类: 如其javadoc中所述,调用将返回与具有给定字符串名称的类或接口关联的对象,即它返回受type变量影响的对象。 然后,调用创建该 对象表示的类的新实例。就像通过带有空参数列表的表达式实例化该类。换

  • 问题内容: 连接到MySQL数据库时,请执行以下步骤 实际上,我想知道语句的作用。 虽然此类不在mysql.jar中。它在哪里? 问题答案: 本类位于java.lang包,因此在分布用java,并自动导入到每个班级。 该方法所做的只是返回由类加载器加载的参数对象。然后,该方法返回该类的新实例。 因此,发生什么情况是您称之为 返回com.mysql.jdbc.Driver.class。然后,您调用该

  • 问题内容: 我已经在使用商业JDBC驱动程序的示例应用程序中看到了这一行: 不使用返回值。 这条线有什么作用? 问题答案: 它执行该类的静态加载。因此,块中的所有内容都将运行。

  • 问题内容: 以下代码: 是/是打开JDBC连接所必需的。 我听说现代JDBC驱动程序不再需要它。但是我无法在项目中将其删除,因为我遇到了异常。我正在使用Java7和tomcat7。 什么时候可以省略构建? 问题答案: 从JDBC 4.0开始,不需要Class.forName()。 这是JDBC的Java教程的摘录。 在 早期 版本的JDBC中,要获得连接,首先必须通过调用方法Class.forNa

  • 问题内容: 命令会是什么 连接到Oracle数据库时该怎么做?是否有另一种做同一件事的方式? 问题答案: 它使用FQCN(完全限定的类名)获取对类对象的引用。 除了确保指定的类由当前的classloader加载之外,它在连接数据库方面不做任何事情。写作之间没有根本区别 调用显示在使用JDBC的旧代码中,因为这是加载JDBC驱动程序的旧方法。 从Java教程: 在早期版本的JDBC中,要获得连接,首

  • 问题内容: 我需要使用字符串参数并在Python中创建以该字符串命名的类的对象。在Java中,我会使用。在Python中是否有等同功能? 感谢你的答复。回答那些想知道我在做什么的人:我想使用命令行参数作为类名,并实例化它。我实际上是在Jython中编程并实例化Java类,因此是问题的Java实质。 效果很好。非常感谢。 问题答案: python中的反射比Java中的反射更容易,更灵活。 没有直接函