为什么
Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
dbConnection = DriverManager.getConnection(strUrl, props);
而不是
dbConnection = EmbeddedDriver.connect(strUrl, props);
指定字符串是否更容易出错,而不是编译器可以检查的类名?我看到了一个从配置中获取类名的示例,但这似乎是使用的模式,无论可用的替代方案如何。
答案 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所需的行为。