为什么选择Class.forName('database driver')?



为什么

Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
dbConnection = DriverManager.getConnection(strUrl, props);
不是

dbConnection = EmbeddedDriver.connect(strUrl, props);

?

不是更容易出错指定一个字符串,而不是一个类名,可以由编译器检查?我看到了一个从配置中获得类名的示例,但这似乎是不管可用的替代方案如何使用的模式。

使用JDBC 4.0驱动程序(及以上),您所需要的是

dbConnection = DriverManager.getConnection(strUrl, props);

根据DriverManager javadoc

JDBC 4.0 Drivers必须包含文件META-INF/services/java.sql.Driver。该文件包含java.sql.Driver的JDBC驱动程序实现的名称。例如,要加载my.sql.Driver类,则需要在META-INF/services/java.sql. net文件中加载my.sql.Driver类。驱动程序文件将包含以下条目:

my.sql.Driver

应用程序不再需要使用Class.forName()显式加载JDBC驱动程序。目前使用Class.forName()加载JDBC驱动程序的现有程序无需修改即可继续工作。

第一个代码片段让您的程序避免了对EmbeddedDriver类的编译时依赖。例如,您可以将"org.apache.derby.jdbc.EmbeddedDriver"字符串放在配置文件中,并在运行时读取它。

第二个代码片段将对EmbeddedDriver类的依赖"嵌入"到程序体中,使得在不重新编译代码的情况下不可能切换驱动程序。

不是更容易出错指定一个字符串,而不是一个类名,可以由编译器检查?

那是绝对正确的。为驱动类的名称指定Java字符串文字并不是一种合适的方式,因为您的程序不会从按名称访问类中获得任何灵活性。

原因是,如果您使用EmbeddedDriver.connect,那么JVM将在初始化包含该语句的类时加载EmbeddedDriver类。除此之外,如果在类路径中没有找到EmbeddedDriver,这将导致程序失败,即使EmbeddedDriver类实际上永远不会被使用。(想要延迟解析类还有其他原因。)

我认为这在JDBC的第一个版本中是必需的,以确保在请求连接时DriverManager加载了驱动程序类。直接访问代码中的驱动程序类需要在编译时提供驱动程序JAR,这不是JDBC API所期望的行为。

最新更新