`
qinjingkai
  • 浏览: 259858 次
  • 性别: 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
分享到:
评论

相关推荐

    sun.jdbc.odbc.JdbcOdbcDriver下载

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

    jdbc中class.forname的作用

    主要介绍了jdbc中class.forname的作用,使用示例说明了他作用及使用方法,大家参考使用吧

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

    主要介绍了使用JDBC操作MySQL需要添加Class.forName("com.mysql.jdbc.Driver")的相关知识,非常不错,具有一定的参考借鉴价值 ,需要的朋友可以参考下

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

    注册驱动:Class.forName(xxx.Driver).xmind

    对SPI,理论联系实际的理解

    jdbc驱动程序实例

    //或者Class.forName("com.mysql.jdbc.Driver"); String url ="jdbc:mysql://localhost/myDB? user=soft&password=soft1234&useUnicode=true&characterEncoding=8859_1" //myDB为数据库名 Connection conn= ...

    jdbc.class

    jdbc连接jdbc.class 可用于记事版 与数据库连接

    jdbc笔记整理 sql

    Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); //Sql Server7.0/2000 数据库 Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance(); //DB2 数据库 Class.froName(...

    sql jdbc 2.0.1607.1 UNIX

    Therefore, applications do not need to call the Class.forName method to register or load the driver when using the sqljdbc4.jar class library. When the getConnection method of the DriverManager ...

    hive-jdbc-2.1.0-standalone.jar

    at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Unknown Source) at com.trs.gateway.commons.hive.HiveFeature.getConnection(HiveFeature.java:55) ... 8 more

    jdbc--sqljdbc4-2.0.jar

    java链接sqlserver数据库包如下错误时: java.lang.ClassNotFoundException: ... at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Unknown Source) 添加sqljdbc4-2.0包即可

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

    如果熟悉使用JDBC来连接数据库的同学一定很清楚连接数据库的代码中一定会有依据Class.forName (com.mysql.jdbc.Driver); public static Connection getConnection() throws ClassNotFoundException, SQLException ...

    JDBC连接各种数据代码.doc

    Class.forName( "oracle.jdbc.driver.OracleDriver" ); con = DriverManager.getConnection( "jdbc:oracle:thin:@127.0.0.1:1521:ORCL", "scott", ”tiger”); 连接SqlServer2000 msbase.jar ...

    sqljdbc_sqljdbc4.zip

    Java连接SQL server数据库驱动,文件包含sqljdb和sqljdbc4 ...sqljdbc:Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); sqljdbc4:Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

    Oracle数据库的JDBC驱动包

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

    java连接数据库字符串

    Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); //Sql Server7.0/2000数据库 Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance(); //DB2数据库 Class....

    sql jdbc 2.0

    Therefore, applications do not need to call the Class.forName method to register or load the driver when using the sqljdbc4.jar class library. When the getConnection method of the DriverManager ...

    Access_JDBC30.jar --Java JDK1.8实现与Access数据库连接

    Java写了一个连接Access数据库... Class.forName("com.hxtt.sql.access.AccessDriver").newInstance(); url = "jdbc:Access:///D:/dataAnalysis/accessDB.mdb"; connect = DriverManager.getConnection(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 conn...

    greenplum-jdbc-5.1.4.jar

    forName(className);  System. out.println("加载数据库驱动成功!" );  } catch (ClassNotFoundException e ) {  System. out.println("加载数据库驱动失败!" );  e.printStackTrace();  }  }  /*...

Global site tag (gtag.js) - Google Analytics