我想知道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");
但为什么呢? 谢谢你的帮助!
答案 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.Driver
和java.sql.DriverManager
的文档中找到它的要点。
基本上,从JDBC 4开始,您所要做的就是为SQL驱动程序实现创建一个META-INF/services/java.sql.Driver
文件,JRE将自动加载它。这意味着您可以直接尝试:
DriverManager.getConnection("yourUrlHere")
如果一个驱动程序识别该URL,它将自动使用。