gpt4 book ai didi

java - JDBC 如何知道到哪里寻找驱动程序类?

转载 作者:搜寻专家 更新时间:2023-10-30 20:04:21 24 4
gpt4 key购买 nike

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

例子:

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

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

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

jdbc:derby:...

我期望的是这样的:

jdbc:ConcreteDriverClassForInit

如您所见,我缺少类加载器中加载的类与该类的连接字符串调用之间的链接。

我在 derby 存档中搜索名为“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");

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

最佳答案

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

static {
EmbeddedDriver.boot();
}

检查引导方法的代码here ,你会看到协议(protocol)在哪里注册:

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 ,它将调用 JDBC.isValidURL(String url) 来知道这个类是否是特定 JDBC url 的有效驱动程序,只有当 url 包含 时,SQLite 驱动程序才会返回 true前缀 jdbc:sqlite:.

关于java - JDBC 如何知道到哪里寻找驱动程序类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31210271/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com