我理解类加载对于在运行时使用类名加载类很有用。
然而,在我们的项目中使用JDBC时,我们知道我们将使用哪个驱动程序,并且主要是驱动程序管理器字符串是硬编码的。
我的问题是:为什么我们在这里使用Class.forName("JDBC_DRIVER")
加载驱动程序?
为什么我们不能继续在类路径中添加驱动程序?因为我们知道我们将使用哪个驱动程序罐。
我相信Class.forName(JDBC_DRIVER)
会将驱动程序加载到DriverManager
。这是唯一的原因吗?
修改1:
作为其(DriverManager)初始化的一部分,DriverManager类将尝试加载“jdbc.drivers”系统属性中引用的驱动程序类。
应用程序不再需要使用
Class.forName()
明确加载JDBC驱动程序。当前使用Class.forName()
加载JDBC驱动程序的现有程序将继续工作而无需修改。
然后当我使用oracle驱动程序以外的时候;我是否需要更改系统属性中的驱动程序名称字符串?
答案 0 :(得分:24)
首先:使用现代JDBC驱动程序和当前JDK(至少是Java 6),不再需要调用Class.forName()
。 JDBC driver classes are now located使用service provider mechanism。你应能够简单地删除该调用并保持其余代码不变,并且它应该继续工作。
如果您没有使用当前的JDK(或者如果您有一个不的JDBC驱动程序已将相应的文件设置为使用该机制),那么驱动程序需要注册DriverManager
使用registerDriver
。该方法通常是从实际驱动程序类的静态初始化程序块调用,该类在首次加载时被触发,因此发出Class.forName()
可确保驱动程序自行注册(如果是还没有完成。)
无论您使用Class.forName()
还是使用新的服务提供程序机制,总是需要类路径上的JDBC驱动程序(或者在运行时通过某些ClassLoader
提供) ,至少)。
tl; dr :是的,仅使用该Class.forName()
调用是为了确保驱动程序已注册。如果您使用当前的JDK和当前的JDBC驱动程序,则此调用不再是必需的。
答案 1 :(得分:12)
Class.forName(JDBC_DRIVER)调用将在DriverManager中注册您的JDBC驱动程序,因此您可以通过url来解决它,例如“jdbc:odbc:Database”等等......
通常驱动程序类具有这样的静态初始化代码,它在Class.forName()上调用:
public class Driver implements java.sql.Driver {
static {
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
}
您仍然需要将JDBC驱动程序jar放入类路径中。
作为替代方案,您可以使用特定于数据库的DataSource,然后可以声明性地指定数据源类型,例如在Spring上下文或Web服务器JNDI中。这是一个example。
答案 2 :(得分:4)
将类放在类路径中是不足以让类加载器加载它。并且必须加载驱动程序类以确保它已注册到JDBC API。顺便说一句,要使Class.forName
工作,驱动程序类必须在类路径中。
答案 3 :(得分:2)
在许多工业应用中,我们希望通过以属性文件/配置文件的形式提取此类信息,从其余代码中抽象数据访问层。在这些情况下,我们可能需要像您一样使用某些东西。
例如我们可以使用JDBC接口类来编写访问数据库的代码,您可以通过选择要用作数据库的技术(例如ojdbc驱动程序或mysql jdbc驱动程序等)来配置属性。在这些情况下,可以使用这种方法加载类。