JDBC如何知道在哪里查找驱动程序类?

时间:2015-07-03 15:34:35

标签: java database jdbc database-connection

我想知道JDBC如何知道它应该使用哪个数据库驱动程序类。

示例:

Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
Connection verbindung = DriverManager.getConnection("jdbc:derby:d:/memory/onlineshop;create=true");

第一行需要注意,驱动程序(EmbeddedDriver)将被加载到类加载器中(因此可用,例如用于反射,对吧?)。

所以,下一行是我的连接字符串。它始于:

  

JDBC:德比:...

我期待这样的事情:

  

JDBC:ConcreteDriverClassForInit

正如您所看到的,我错过了类加载器中加载的类与该类的连接字符串调用之间的链接。

我在德比档案中搜索了一个名为" Derby.Class" - 但是没有这样的课程。

即使我尝试了......像这样,JDBC仍然知道,该怎么做:

Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
Class.forName("org.something.anyotherDBDriver1");
Class.forName("org.something.anyotherDBDriver2");
Connection verbindung = DriverManager.getConnection("jdbc:derby:d:/memory/onlineshop;create=true");

但为什么呢? 谢谢你的帮助!

2 个答案:

答案 0 :(得分:4)

当你加载为特定JDBC类型添加处理程序的类时,EmbeddedDriver类有一个静态块:

static {
    EmbeddedDriver.boot();
}

检查启动方法here的代码,您将看到协议的注册位置:

new JDBCBoot().boot(Attribute.PROTOCOL, ps);

该特定字符串位于org.apache.derby.iapi.reference

String PROTOCOL = "jdbc:derby:";

这是所有JDBC驱动程序遵循的常见模式,我不特别喜欢这个驱动程序的代码,如果你想要一个更清晰的例子来看SQLite driver,那么更直接的实现:

static {
    try {
        DriverManager.registerDriver(new JDBC());
    }
    catch (SQLException e) {
        e.printStackTrace();
    }
}

org.sqlite.JDBC会将自己注册到将调用java.sql.DriverManager的{​​{1}}以了解此类是否是特定JDBC JDBC.isValidURL(String url)的有效驱动程序,SQLite驱动程序将返回仅当url包含true url时才PREFIX

答案 1 :(得分:1)

在以前的JDBC版本中,要获得连接,首先需要通过调用Class.forName()方法来加载JDBC驱动程序。

目前,类路径中找到的任何JDBC 4.0驱动程序都会自动加载。因此,甚至不需要Class.forName()

可以在java.sql.Driverjava.sql.DriverManager的文档中找到它的要点。

基本上,从JDBC 4开始,您所要做的就是为SQL驱动程序实现创建一个META-INF/services/java.sql.Driver文件,JRE将自动加载它。这意味着您可以直接尝试:

DriverManager.getConnection("yourUrlHere")

如果一个驱动程序识别该URL,它将自动使用。