“Class.forName(”MY_JDBC_DRIVER“)”的目的是什么?
我知道类加载对于在运行时加载它的类名是很有用的。
但是,在我们的项目中使用JDBC时,我们知道我们要使用哪个驱动程序,而且大多数驱动程序pipe理器string是硬编码的
我的问题是:为什么我们在这里使用Class.forName("JDBC_DRIVER")
加载驱动程序?
为什么我们不能在课程path中添加驱动程序? 因为我们知道我们将使用哪个驱动程序jar。
我相信Class.forName(JDBC_DRIVER)
将加载驱动程序到DriverManager
。 这是唯一的原因吗?
编辑1:
DriverManager
API文档指出
作为其(DriverManager)初始化的一部分,DriverManager类将尝试加载“jdbc.drivers”系统属性中引用的驱动程序类。
应用程序不再需要使用
Class.forName()
来显式加载JDBC驱动程序。 当前使用Class.forName()
加载JDBC驱动程序的程序将继续工作而不进行修改。
那么当我使用的不是oracle驱动程序; 我需要更改系统属性中的驱动程序名称string吗?
首先:使用现代JDBC驱动程序和当前JDK(至lessJava 6),不再需要调用Class.forName()
。 JDBC驱动程序类现在使用服务提供者机制来定位 。 你应该能够简单地删除那个调用,并且保持代码的其余部分不变,它应该继续工作。
如果您不使用当前的JDK(或者如果您的JDBC驱动程序没有设置适当的文件来使用该机制),那么驱动程序需要使用registerDriver
注册到DriverManager
。 该方法通常从实际驱动程序类的静态初始化块中调用,该类在第一次加载时被触发,所以发出Class.forName()
可以确保驱动程序自己注册(如果尚未完成)。
无论你使用Class.forName()
还是新的服务提供者机制,你总是需要类path上的JDBC驱动程序(或者至less在运行时通过一些ClassLoader
)。
tl; dr :是的,该Class.forName()
调用的唯一用途是确保驱动程序已注册。 如果您使用当前的JDK和当前的JDBC驱动程序,则不应再调用此调用。
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放入类path中。
或者,您可以使用特定于数据库的DataSource,然后您可以声明性地指定数据源types,例如在Spring上下文中或Web服务器JNDI中。 这是一个例子 。
在类path中放置一个类不足以让它通过类加载器加载。 并且必须加载驱动程序类以确保它已注册到JDBC API。 顺便说一句,为Class.forName
工作,驱动程序类必须在类path。
在许多工业应用中,我们希望通过以属性文件/configuration文件的forms提取这些信息来从其余代码中提取数据访问层。 在这些情况下,我们可能需要像你一样使用一些东西。
例如,我们可以使用JDBC接口类来编写访问数据库的代码,通过select要用作数据库的技术来configuration属性(例如,ojdbc驱动程序或mysql jdbc驱动程序等)。你可以使用这种方法加载类。