为什么Class.forName('数据库驱动程序')?

时间:2014-07-09 15:05:52

标签: java database jdbc

为什么

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

而不是

dbConnection = EmbeddedDriver.connect(strUrl, props);

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

4 个答案:

答案 0 :(得分:6)

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

dbConnection = DriverManager.getConnection(strUrl, props);

根据DriverManager javadoc,

  

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

     

my.sql.Driver

     

应用程序不再需要使用Class.forName()明确加载JDBC驱动程序。当前使用Class.forName()加载JDBC驱动程序的现有程序将继续工作而无需修改。

答案 1 :(得分:3)

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

第二个代码片段将“EmbeddedDriver类的依赖关系”加入到程序体中,这样就无法在不重新编译代码的情况下切换驱动程序。

  

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

这是绝对正确的。为驱动程序类的名称指定Java字符串文字不是一种正确的方法,因为您的程序无法通过名称访问该类获得任何灵活性。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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