Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 调用Class.forName()而不保存对它返回的对象的引用的目的是什么?_Java_Sql_Class - Fatal编程技术网

Java 调用Class.forName()而不保存对它返回的对象的引用的目的是什么?

Java 调用Class.forName()而不保存对它返回的对象的引用的目的是什么?,java,sql,class,Java,Sql,Class,在下面展示如何使用Java的SQL库的示例中,调用Class.forName(),而不使用变量来保存对对象的引用。如果以后无法操作,那么这样做的目的是什么?我在SQL库的各种示例中看到了这一行 import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public cl

在下面展示如何使用Java的SQL库的示例中,调用
Class.forName()
,而不使用变量来保存对对象的引用。如果以后无法操作,那么这样做的目的是什么?我在SQL库的各种示例中看到了这一行

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class Sample
{
  public static void main(String[] args) throws ClassNotFoundException
  {
    // load the sqlite-JDBC driver using the current class loader
    Class.forName("org.sqlite.JDBC");

    Connection connection = null;
    try
    {
      // create a database connection
      connection = DriverManager.getConnection("jdbc:sqlite:sample.db");
      Statement statement = connection.createStatement();
      statement.setQueryTimeout(30);  // set timeout to 30 sec.

      statement.executeUpdate("drop table if exists person");
      statement.executeUpdate("create table person (id integer, name string)");
      statement.executeUpdate("insert into person values(1, 'leo')");
      statement.executeUpdate("insert into person values(2, 'yui')");
      ResultSet rs = statement.executeQuery("select * from person");
      while(rs.next())
      {
        // read the result set
        System.out.println("name = " + rs.getString("name"));
        System.out.println("id = " + rs.getInt("id"));
      }
    }
    catch(SQLException e)
    {
      // if the error message is "out of memory", 
      // it probably means no database file is found
      System.err.println(e.getMessage());
    }
    finally
    {
      try
      {
        if(connection != null)
          connection.close();
      }
      catch(SQLException e)
      {
        // connection close failed.
        System.err.println(e);
      }
    }
  }
}

它使类初始值设定项运行——在JDBC驱动程序的情况下,这是驱动程序注册自身的方式。在现代Java中,JDBC驱动程序通常使用API

从文档中:

应用程序不再需要使用
Class.forName()
明确加载JDBC驱动程序。当前使用
Class.forName()
加载JDBC驱动程序的现有程序将继续工作,无需修改


它将使类加载器在指向实现JDBC的库的类的DriverManager中加载驱动程序类实现,因此您可以通过接口而不是直接实现轻松使用JDBC。此外,请阅读。它讨论了
Class.forName()
和JDBC.BalusC在线程中的答案,@informatik01提到的答案是正确的,非常清楚+1对。它会使驱动程序注册到DriverManager框架,以便稍后在使用DriverManager使用连接时,它知道要为哪个连接模式使用哪个JDBC驱动程序。我认为使用Class.forName(“驱动程序类名称”)的现代替代方法是:DriverManager.registerDriver(new org.sqlite.JDBC())@基思:不,我相信现代的等价物是让服务提供商API自己解决问题。您只需指定JDBC URL,它就会找到driver.Hmmm,思想实验:因此,如果我的类路径中有1000个JDBC驱动程序JAR,我将调用DriverManager.getConnection(URL)。在这一点上,是否要从所有1000个jar中加载类,以某种方式查询它们以确定使用哪一个是正确的?我只是运行了一个简单的测试用例,没有调用regster行,我得到了:没有找到适合jdbc的驱动程序:mysql://localhost:3306/db.@基思:这让我很惊讶——它本应该奏效的。我将引用文档中的相关部分。你是对的。更新了我的测试用例以使用新版本的JDBC驱动程序,现在它可以工作了,无需调用registerDriver()。我猜较新的JDBC驱动程序JAR有一个标准的资源/属性文件,将模式映射到驱动程序类——或者类似的东西。