`
qinjingkai
  • 浏览: 262156 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

jdbc之Class.forName

阅读更多

   今天闲来无事,看了看刚学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")并不会触发静态代码的执行;


 

1
0
分享到:
评论

相关推荐

    java中Class.forName方法的作用详解

    总的来说,`Class.forName()`在Java中起到了动态加载和初始化类的关键作用,尤其在JDBC和其他需要延迟加载或动态选择实现的场景中。了解这个方法的工作原理,对于理解Java程序的运行机制和优化代码是十分重要的。在...

    sun.jdbc.odbc.JdbcOdbcDriver.zip

    使用JDBC-ODBC桥之前,开发者需要在系统中设置合适的ODBC数据源,然后在Java代码中通过"Class.forName()"加载驱动并建立数据库连接。 总结来说,"sun.jdbc.odbc.JdbcOdbcDriver.zip"是一个包含Java的JDBC-ODBC桥的...

    jdbc中class.forname的作用

    在Java JDBC编程中,`Class.forName()` 方法起着至关重要的作用。它的主要任务是动态加载指定的类并执行其实例的静态初始化块。在上下文中,`Class.forName()` 被用来加载数据库驱动,比如MySQL的`...

    sun.jdbc.odbc.jdbcodbcdriver-Maven.zip

    在Java的早期版本中,这个类位于`sun.jdbc.odbc`包下,可以直接通过Class.forName()方法加载并注册到JDBC驱动管理器,例如: ```java Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); ``` 然后,通过创建适当的URL...

    sun.jdbc.odbc.JdbcOdbcDriver下载

    jdbc-odbc驱动包,提示找不到驱动,java.lang.ClassNotFoundException: sun.jdbc.odbc.JdbcOdbcDriver, 原因:从jdk从1.8开始,删除了jdbc-odbc桥,所以odbc的驱动是用不了的 解决方法:这里为提供一个解决JDK1.8不...

    Oracle数据库的JDBC驱动包

    其中classes12.jar是从oracle安装目录中获取的,使用它编写java程序连接oracle时,驱动包的加载路径为"oracle.jdbc.driver.OracleDriver",即Class.forName("oracle.jdbc.driver.OracleDriver")。另一个ojdbc6.jar的...

    Dm7JdbcDriver16.jar Dm7JdbcDriver17.jar Dm7JdbcDriver18.jar

    Class.forName("com.dameng.jdbc.DmDriver"); Connection conn = DriverManager.getConnection("jdbc:dm://hostname:port/dbname", "username", "password"); ``` 其中,"com.dameng.jdbc.DmDriver"是达梦JDBC...

    Cannot load JDBC driver class 'com.microsoft.sqlserver.jdbc.SQLServerDriver'

    Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); ``` 如果这个方法抛出ClassNotFoundException,表示驱动类没有找到。 4. **环境配置问题**:检查JDBC URL、用户名和密码是否正确设置。这些...

    jdbc驱动程序实例

    Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); String url = "jdbc:oracle:thin:@localhost:1521:orcl"; // orcl为数据库的SID String user = "test"; String password = "test"; Connection ...

    浅析使用JDBC操作MySQL需要添加Class.forName("com.mysql.jdbc.Driver")

    不使用`Class.forName()`的现代JDBC实践: 随着Java版本的更新,现在推荐使用Java的Service Provider Interface (SPI) 来自动加载驱动,避免显式调用`Class.forName()`。在JDBC 4.0及更高版本中,只需要将驱动的JAR...

    java连接多种数据库的驱动

    java连接各种数据库的驱动 jar包 orale: Class.forName("oracle.jdbc.driver.OracleDriver"); mysql:Class.forName("com.mysql.jdbc.Driver"); access:Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); sqlsever:...

    sqlite jdbc jar java jdbc 链接 sqlite sqlite-jdbc-3.8.11.1.jar

    Class.forName("org.sqlite.JDBC"); ``` 2. **创建连接**:使用 `DriverManager.getConnection()` 方法创建数据库连接。你需要提供数据库的 URL,对于 SQLite,URL 是以 `jdbc:sqlite:` 开头,后跟数据库文件的...

    com.mysql.cj.jdbc.Driver.zip

    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....

    SQL Server_JDBC驱动【mssql-jdbc-6.4.0.jre8.jar】.rar

    Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); Connection conn = DriverManager.getConnection(url, username, password); System.out.println("Connected to the database!"); // 执行...

    sqljdbc4.jar, sqljdbc41.jar, sqljdbc42.jar三个包

    1. **导入驱动**: 在Java代码中,你需要通过`Class.forName()`方法加载JDBC驱动。 2. **建立连接**: 使用`DriverManager.getConnection()`方法,提供数据库URL、用户名和密码来创建一个`Connection`对象。 3. **创建...

    JDBC驱动8.0.25JAR.zip

    1. 加载驱动:使用`Class.forName()`方法加载特定的JDBC驱动类。 2. 创建连接:通过`DriverManager.getConnection()`方法,传入数据库URL、用户名和密码来建立连接。 3. 获取Statement或PreparedStatement对象:根据...

    sqlite-jdbc-3.8.7.jar下载

    首先,需要加载驱动(`Class.forName("org.sqlite.JDBC")`),然后使用数据库URL(如`jdbc:sqlite:/path/to/database.db`)建立连接。 ```java import java.sql.Connection; import java.sql.DriverManager; ...

    Class.forName()_newInstance()_New_三者区别

    在Java编程中,`Class.forName()`, `newInstance()` 和 `new` 关键字都是与对象创建和类加载紧密相关的概念,但它们各自有着不同的用途和限制。 首先,`Class.forName("className")` 是一个静态方法,它用于在运行...

    hana jdbc ngdbc.jar com.sap.db.jdbc.Driver

    2. 在代码中使用 `Class.forName()` 方法加载驱动类,例如:`Class.forName("com.sap.db.jdbc.Driver")`。 3. 使用 `DriverManager.getConnection()` 创建数据库连接,提供 HANA 数据库的 URL、用户名和密码,如:`...

    Dm7JdbcDriver.zip

    - 注册驱动:通过Class.forName()方法注册JDBC驱动,例如:`Class.forName("com.dameng.jdbc.DmDriver");` - 获取连接:使用DriverManager.getConnection()方法创建数据库连接,需要提供数据库URL、用户名和密码,...

Global site tag (gtag.js) - Google Analytics