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

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

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

它动态加载一个类。 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 URL。

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

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