Java JAR(库)用法

时间:2014-05-01 19:16:01

标签: java jdbc

我曾经在Eclipse中使用过一次GSON库,这很容易。 刚刚将它添加为外部库,并在源文件中导入了它,并且能够像使用Java中的任何其他类一样使用它。 例如:

Gson gson = new Gson(); //and just use it

最近我不得不使用SQLIte数据库文件,所以我下载了JDBC驱动程序库并将其添加到我的Eclipse项目中。 但我注意到使用它有一种奇怪的(至少对我而言)语法。 我导入了java.sql.*但是为了能够使用它的类,我必须执行以下操作:

 Class.forName("org.sqlite.JDBC");

我知道这个命令的返回值是Class对象(在运行时),但从语法中可以看出它永远不会被使用。

请解释那里发生的事情以及为什么我不能在不首先调用Class.forName的情况下使用SQL包类。

2 个答案:

答案 0 :(得分:1)

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

来源 - What does 'Class.forName("org.sqlite.JDBC");' do?

答案 1 :(得分:0)

基本上,它允许JVM注册您的代码正在使用的java.sql.*库的实现。通过这种方式,您可以依赖标准接口,而无需通过需要实施级别详细信息的环节和障碍。