JDBC 如何知道去哪里寻找驱动程序类?

Cod*_*bal 3 java database database-connection jdbc

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

例子:

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

第一行需要注意,驱动程序(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");
Run Code Online (Sandbox Code Playgroud)

但为什么?感谢您的帮助!

Umb*_*ndi 5

EmbeddedDriver当您加载为特定 JDBC 类型添加处理程序的类时,该类会执行一个静态块:

static {
    EmbeddedDriver.boot();
}
Run Code Online (Sandbox Code Playgroud)

在这里查看 boot 方法的代码,你会看到协议注册的位置:

new JDBCBoot().boot(Attribute.PROTOCOL, ps);
Run Code Online (Sandbox Code Playgroud)

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

String PROTOCOL = "jdbc:derby:";
Run Code Online (Sandbox Code Playgroud)

这是所有 JDBC 驱动程序都遵循的常见模式,我不是特别喜欢这个驱动程序的代码,如果您想要一个更清晰的示例,请查看SQLite 驱动程序,更简单的实现方式:

static {
    try {
        DriverManager.registerDriver(new JDBC());
    }
    catch (SQLException e) {
        e.printStackTrace();
    }
}
Run Code Online (Sandbox Code Playgroud)

org.sqlite.JDBC会将自身注册到java.sql.DriverManager将调用的JDBC.isValidURL(String url)来了解此类是否是特定 JDBC 的有效驱动程序,只有当包含 时url,SQLite 驱动程序才会返回。trueurlPREFIX jdbc:sqlite: