今天闲来无事,看了看刚学java时候的数据库demo程序;代码再简单不过,相信大家在熟悉不过了 ,无非就是如下(以mysql为例) :
Class.forName(
"com.mysql.jdbc.Driver"
);
String url =
"jdbc:mysql://127.0.0.1/test"
;
String user =
"root"
;
String psw =
"root"
;
Connection con = DriverManager.getConnection(url,user,psw);
余下了就不写了,写的话估计大家也是味同嚼蜡;
相信刚接触到数据库的朋友也回见过这在普通不过的代码了,因为是初学,所以每个人都小心翼翼的参照教科书上的步骤依葫芦画瓢,也没有人会太关心为什么那么写;还有些人说 不要太关心底层的东西;但今天我一个疑惑在我的大脑里面产生了,那就是Class.forName到底有怎么用,或许有人会说是加载数据库驱动,对那是教科书的说法,我没有说他错,但到底是怎么加载 的呢;我非常疑惑的是class.forName并没有作为任何语句的右值,也就是并没有出现我们编程中的Student s=new Student(); s.say();等常见的形式; 疑惑出现了,就要解答,我从来不习惯于也不迷信于教科书上的讲法,更何况今天有点时间;根据之前写程序的经验class.forName的作用主要有几个方面 一 获得一个类的实例 如Student.class.newInstance 二是获得classLoader 即
Student.class.getClassLoader() 第三是 执行某一个类的静态代码块 ;由于刚才已经说了,这个语句没有作为任何语句的右值,所以 第一和第二种作用可以排除,剩下的就只有第三个可能了;但问题是加载哪一个类的静态代码块呢,一时想不明白,没办法只好试用着把class.forName注释,结果就不用说了,肯定是通不过了,那唯一的解释就是该句对后面的代码有影响,于是开始看后面的代码,看DriverManage的源代码,终于弄明白了;DriverManagerz在调用getConnection方法之前,保证相应的Driver类已经被加载到jvm中,,并且完成了类的初始化工作;而DriverManger把已经加载的Driver类放到一个集合中,这一步通过registerDriver(java.sql.Driver driver),这里Driver是一个接口,每一个数据库厂商做出了不同的实现,mysql的就是com.mysql.jdbc包下的Driver了,也就是被写烂了的Class.forName("com.mysql.jdbc.Driver")了,最后看了一下Driver的源代码 ,果然在它的静态代码里面调用了DriverManager里面的registerDriver,代码如下
package com.mysql.jdbc;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
public class Driver extends NonRegisteringDriver
implements java.sql.Driver
{
static
{
try
{
DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
}
在回头看一下oralce的也类似
package oracle.jdbc;
import oracle.jdbc.driver.OracleDriver;
public class OracleDriver extends oracle.jdbc.driver.OracleDriver
{
}
package oracle.jdbc.driver;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.DriverPropertyInfo;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Properties;
import oracle.jdbc.dbaccess.DBAccess;
import oracle.jdbc.dbaccess.DBError;
import oracle.jdbc.oci.OracleOCIConnection;
public class OracleDriver
implements Driver{
.........
static
{
m_driverAccess.put("thin-server", "oracle.jdbc.thinserver.ServerTTC7Protocol");
m_driverAccess.put("oci-server", "oracle.jdbc.ociserver.ServerOCIDBAccess");
m_driverAccess.put("thin", "oracle.jdbc.ttc7.TTC7Protocol");
m_driverAccess.put("oci8", "oracle.jdbc.oci8.OCIDBAccess");
m_driverAccess.put("oci", "oracle.jdbc.oci8.OCIDBAccess");
m_driverAccess.put("kprb", "oracle.jdbc.kprb.KprbDBAccess");
m_defaultConn = null;
m_defaultDriver = null;
Timestamp localTimestamp = Timestamp.valueOf("2000-01-01 00:00:00.0");
try
{
if (m_defaultDriver == null)
{
m_defaultDriver = new OracleDriver();
DriverManager.registerDriver(m_defaultDriver);
}
}
catch (RuntimeException localRuntimeException)
{
}
catch (SQLException localSQLException)
{
}
}
到这里所有的疑惑都解决了!
最后说一下类的静态代码块在什么时候被执行
1 通常的创建实例 new Student()等等
2 第一次加载这个 类到jvm,如Class.forName,Studeng.class等
注意 ClassLoader.loadclass("xxxxx")并不会触发静态代码的执行;
分享到:
相关推荐
总的来说,`Class.forName()`在Java中起到了动态加载和初始化类的关键作用,尤其在JDBC和其他需要延迟加载或动态选择实现的场景中。了解这个方法的工作原理,对于理解Java程序的运行机制和优化代码是十分重要的。在...
使用JDBC-ODBC桥之前,开发者需要在系统中设置合适的ODBC数据源,然后在Java代码中通过"Class.forName()"加载驱动并建立数据库连接。 总结来说,"sun.jdbc.odbc.JdbcOdbcDriver.zip"是一个包含Java的JDBC-ODBC桥的...
在Java JDBC编程中,`Class.forName()` 方法起着至关重要的作用。它的主要任务是动态加载指定的类并执行其实例的静态初始化块。在上下文中,`Class.forName()` 被用来加载数据库驱动,比如MySQL的`...
在Java的早期版本中,这个类位于`sun.jdbc.odbc`包下,可以直接通过Class.forName()方法加载并注册到JDBC驱动管理器,例如: ```java Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); ``` 然后,通过创建适当的URL...
jdbc-odbc驱动包,提示找不到驱动,java.lang.ClassNotFoundException: sun.jdbc.odbc.JdbcOdbcDriver, 原因:从jdk从1.8开始,删除了jdbc-odbc桥,所以odbc的驱动是用不了的 解决方法:这里为提供一个解决JDK1.8不...
其中classes12.jar是从oracle安装目录中获取的,使用它编写java程序连接oracle时,驱动包的加载路径为"oracle.jdbc.driver.OracleDriver",即Class.forName("oracle.jdbc.driver.OracleDriver")。另一个ojdbc6.jar的...
Class.forName("com.dameng.jdbc.DmDriver"); Connection conn = DriverManager.getConnection("jdbc:dm://hostname:port/dbname", "username", "password"); ``` 其中,"com.dameng.jdbc.DmDriver"是达梦JDBC...
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); ``` 如果这个方法抛出ClassNotFoundException,表示驱动类没有找到。 4. **环境配置问题**:检查JDBC URL、用户名和密码是否正确设置。这些...
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); String url = "jdbc:oracle:thin:@localhost:1521:orcl"; // orcl为数据库的SID String user = "test"; String password = "test"; Connection ...
不使用`Class.forName()`的现代JDBC实践: 随着Java版本的更新,现在推荐使用Java的Service Provider Interface (SPI) 来自动加载驱动,避免显式调用`Class.forName()`。在JDBC 4.0及更高版本中,只需要将驱动的JAR...
java连接各种数据库的驱动 jar包 orale: Class.forName("oracle.jdbc.driver.OracleDriver"); mysql:Class.forName("com.mysql.jdbc.Driver"); access:Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); sqlsever:...
Class.forName("org.sqlite.JDBC"); ``` 2. **创建连接**:使用 `DriverManager.getConnection()` 方法创建数据库连接。你需要提供数据库的 URL,对于 SQLite,URL 是以 `jdbc:sqlite:` 开头,后跟数据库文件的...
Class.forName("com.mysql.cj.jdbc.Driver"); Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "username", "password"); ``` 3. **`mysql-connector-java-8.0.27....
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); Connection conn = DriverManager.getConnection(url, username, password); System.out.println("Connected to the database!"); // 执行...
1. **导入驱动**: 在Java代码中,你需要通过`Class.forName()`方法加载JDBC驱动。 2. **建立连接**: 使用`DriverManager.getConnection()`方法,提供数据库URL、用户名和密码来创建一个`Connection`对象。 3. **创建...
1. 加载驱动:使用`Class.forName()`方法加载特定的JDBC驱动类。 2. 创建连接:通过`DriverManager.getConnection()`方法,传入数据库URL、用户名和密码来建立连接。 3. 获取Statement或PreparedStatement对象:根据...
首先,需要加载驱动(`Class.forName("org.sqlite.JDBC")`),然后使用数据库URL(如`jdbc:sqlite:/path/to/database.db`)建立连接。 ```java import java.sql.Connection; import java.sql.DriverManager; ...
在Java编程中,`Class.forName()`, `newInstance()` 和 `new` 关键字都是与对象创建和类加载紧密相关的概念,但它们各自有着不同的用途和限制。 首先,`Class.forName("className")` 是一个静态方法,它用于在运行...
2. 在代码中使用 `Class.forName()` 方法加载驱动类,例如:`Class.forName("com.sap.db.jdbc.Driver")`。 3. 使用 `DriverManager.getConnection()` 创建数据库连接,提供 HANA 数据库的 URL、用户名和密码,如:`...
- 注册驱动:通过Class.forName()方法注册JDBC驱动,例如:`Class.forName("com.dameng.jdbc.DmDriver");` - 获取连接:使用DriverManager.getConnection()方法创建数据库连接,需要提供数据库URL、用户名和密码,...