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)
但为什么?感谢您的帮助!
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 驱动程序才会返回。true
url
PREFIX
jdbc:sqlite:
归档时间: |
|
查看次数: |
2063 次 |
最近记录: |