Java 连接到数据库时Class.forName(“oracle.jdbc.driver.OracleDriver”)的实际用途是什么?
命令是什么Java 连接到数据库时Class.forName(“oracle.jdbc.driver.OracleDriver”)的实际用途是什么?,java,jdbc,Java,Jdbc,命令是什么 Class.forName("oracle.jdbc.driver.OracleDriver") 在连接到Oracle数据库时,您会做什么?是否有其他方法可以执行相同的操作?它使用FQCN(完全限定类名)oracle.jdbc.driver.OracleDriver获取对类对象的引用 除了确保指定的类由当前的类加载器加载之外,它在连接到数据库方面不“做”任何事情。写作和写作之间没有根本的区别 Class<?> driverClass = Class.forName(&q
Class.forName("oracle.jdbc.driver.OracleDriver")
在连接到Oracle数据库时,您会做什么?是否有其他方法可以执行相同的操作?它使用FQCN(完全限定类名)
oracle.jdbc.driver.OracleDriver
获取对类对象的引用
除了确保指定的类由当前的类加载器加载之外,它在连接到数据库方面不“做”任何事情。写作和写作之间没有根本的区别
Class<?> driverClass = Class.forName("oracle.jdbc.driver.OracleDriver");
// and
Class<?> stringClass = Class.forName("java.lang.String");
classdriverclass=Class.forName(“oracle.jdbc.driver.OracleDriver”);
//及
Class stringClass=Class.forName(“java.lang.String”);
Class.forName(“com.example.some.jdbc.driver”)
调用出现在使用jdbc的旧代码中,因为
发件人:
在以前版本的JDBC中,要获得连接,首先必须通过调用方法Class.forName
初始化JDBC驱动程序。此方法需要类型为java.sql.Driver
的对象。每个JDBC驱动程序都包含一个或多个实现接口的类java.sql.driver
…
在类路径中找到的任何JDBC4.0驱动程序都会自动加载。(但是,必须使用方法
Class.forName
手动加载JDBC 4.0之前的任何驱动程序)
进一步阅读(阅读:问题这是一个副本)
Class.forName
初始化JDBC驱动程序。
在类路径中找到的任何JDBC4.0驱动程序都会自动加载。(但是,必须使用方法Class.forName
手动加载JDBC 4.0之前的任何驱动程序)
因此,如果在Java1.6中使用Oracle11g(11.1)驱动程序,则不需要调用
Class.forName
。否则,您需要调用它来初始化驱动程序。它注册驱动程序;某种形式:
public class SomeDriver implements Driver {
static {
try {
DriverManager.registerDriver(new SomeDriver());
} catch (SQLException e) {
// TODO Auto-generated catch block
}
}
//etc: implemented methods
}
在Java 6之前,
DriverManager
类不知道要使用哪个JDBC驱动程序Class.forName(“…”)
是预加载驱动程序类的一种方法
如果您使用的是Java 6,则不再需要执行此操作。另一种方法是在启动JVM时在命令行上指定所需的驱动程序。使用oracle.jdbc.OracleDriver,而不是oracle.jdbc.driver.OracleDriver。如果驱动程序jar文件位于“WEB-INF\lib”目录中,如果您使用的是Tomcat,则不需要注册它。将其另存为test.jsp并将其放在web目录中,然后在Tomcat manager中重新部署web应用文件夹:
<%@ page import="java.sql.*" %>
<HTML>
<HEAD>
<TITLE>Simple JSP Oracle Test</TITLE>
</HEAD><BODY>
<%
Connection conn = null;
try {
Class.forName("oracle.jdbc.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@XXX.XXX.XXX.XXX:XXXX:dbName", "user", "password");
Statement stmt = conn.createStatement();
out.println("Connection established!");
}
catch (Exception ex)
{
out.println("Exception: " + ex.getMessage() + "");
}
finally
{
if (conn != null) {
try {
conn.close();
}
catch (Exception ignored) {
// ignore
}
}
}
%>
简单JSP-Oracle测试
换句话说,它允许您使用驱动程序类,而无需对类进行显式导入。这允许您构建项目,而不必在类路径中包含Oracle驱动程序。请注意,在“传统方式”中,您将调用Class.forName()
,而不捕获对返回的driverClass的引用,因此,乍一看,它似乎是一个无操作操作,这是因为JDBC驱动程序应该有一个静态初始值设定项,该初始值设定项将驱动程序注册到DriverManager。使用Class.forName()时,将执行此初始值设定项并注册驱动程序。由于JDBC 4.0,DriverManager本身使用ServiceLoader在类路径上查找驱动程序。@MattBall,关于JDBC 4.0之前的版本,获取对驱动程序的引用或调用该驱动程序类的静态函数将已经自动加载驱动程序类。那么为什么我们必须手动执行Class.forName(“etc.driver”)
?@Pacerier错误的假设。JDBC不知道要加载哪个驱动程序,因此JDBC(不知道驱动程序)中没有任何东西知道引用驱动程序类。所以你需要一些触发类加载的东西。我认为静态方法可以代替Class.forName(…)
.Related工作:注意,在应用程序启动期间,只需调用它一次;在应用程序的生命周期中,在获得连接之前,您不必每次都调用它。@BalusC假设我在单独的类a
中有我的连接详细信息,我在类a
构造函数中调用class.forName(“oracle.jdbc.driver.OracleDriver”)
,我创建了A的
对象来获取每个servlet的连接字段,在这里我需要连接,然后java将跳过Class.forName(“oracle.jdbc.driver.OracleDriver”)
或者将再次加载?@jonathan“使用Class.forName方法手动加载jdbc 4.0之前的任何驱动程序”是什么意思您能解释一下吗?Class.forName
调用强制类加载器加载给定的类。这是教程中描述的手动加载步骤。@Jonathan,这就是为什么我的连接在没有class.forName()的情况下仍能正常工作的原因代码>:)是的,现在需要使用:OracleDataSource,它自己创建url:final OracleDataSource ds=new OracleDataSource();ds.setDriverType(“thin”);ds.setServerName(主机名);ds.setPortNumber(端口号)//ds.setDatabaseName(dbName);ds.setServiceName(dbName);connection=ds.getConnection(用户,pwd);