`

JDBC连结中Class.forName()详解

 
阅读更多

java开发中,采用JDBC连接数据库,最经常用到的就是Class.forName()这个方法.

Class.forName(String className)在JDK帮助文档中是这样说的:返回与带有给定字符串名的类或接口相关联的Class对象,

参数className是所需类的完全限定名;返回值是具有指定名的类的Class对象.如调用Class.forName("x") 将导致名为x的类被初始化.

 

JDBC连接中,以mysql为例,取得数据库连结代码如下:

 

[java] 
  1. Class.forName("com.mysql.jdbc.Driver");      
  2. String url = "jdbc:mysql://127.0.0.1/test?useUnicode=true&characterEncoding=utf-8";      
  3. String user = "test";      
  4. String psw = "test";      
  5. Connection con = DriverManager.getConnection(url,user,psw);    
[java] 
  1. Class.forName("com.mysql.jdbc.Driver");      
  2. String url = "jdbc:mysql://127.0.0.1/test?useUnicode=true&characterEncoding=utf-8";      
  3. String user = "test";      
  4. String psw = "test";      
  5. Connection con = DriverManager.getConnection(url,user,psw);    

 

 

 

DriverManager.getConnection()可以取到driver是因为Class.forName("...")方法已经要求JVM查找并加载指定的类(即com.mysql.jdbc.Driver类),而jdk对Driver的说明中有以下一段话:
     When a Driver class is loaded, it should create an instance of itself and register it with the DriverManager

查看com.mysql.jdbc的原代码如下:

 

[java]
  1. package com.mysql.jdbc      
  2.      
  3. public class Driver extends NonRegisteringDriver implements java.sql.Driver {      
  4.  // ~ Static fields/initializers       
  5.  // --------------------------------------------- //       
  6.  // Register ourselves with the DriverManager       
  7.  //       
  8.  static {      
  9.     t ry {      
  10.               java.sql.DriverManager.registerDriver(new Driver());      
  11.           } catch (SQLException E) {      
  12.               throw new RuntimeException("Can't register driver!");      
  13.           }      
  14.   }      
  15. // ~ Constructors       
  16.  // -----------------------------------------------------------       
  17. /**    
  18.   * Construct a new driver and register it with DriverManager    
  19.   *     
  20.   * @throws SQLException    
  21.   *             if a database error occurs.    
  22.   */     
  23.  public Driver() throws SQLException {      
  24.      // Required for Class.forName().newInstance()       
  25.  }      
  26. }     
[java] 
  1. package com.mysql.jdbc      
  2.      
  3. public class Driver extends NonRegisteringDriver implements java.sql.Driver {      
  4.  // ~ Static fields/initializers      
  5.  // --------------------------------------------- //      
  6.  // Register ourselves with the DriverManager      
  7.  //      
  8.  static {      
  9.     t ry {      
  10.               java.sql.DriverManager.registerDriver(new Driver());      
  11.           } catch (SQLException E) {      
  12.               throw new RuntimeException("Can't register driver!");      
  13.           }      
  14.   }      
  15. // ~ Constructors      
  16.  // -----------------------------------------------------------      
  17. /**    
  18.   * Construct a new driver and register it with DriverManager    
  19.   *     
  20.   * @throws SQLException    
  21.   *             if a database error occurs.    
  22.   */     
  23.  public Driver() throws SQLException {      
  24.      // Required for Class.forName().newInstance()      
  25.  }      
  26. }     

  

 

 

 

从而通过Class.forName(DriverString)会向DriverManager注册该Driver类.所以可以直接调用.

 

而Class.forName("").newInstance()则等于是将该Driver驱动类实例化,返回该类的一个实例,所以,如果只是取JDBC的Driver驱动,可

以不必用newInstance().

 

原话是这样的:

we just want to load the driver to jvm only, but not need to user the instance of driver, so call Class.forName(xxx.xx.xx) is enough, if you call Class.forName(xxx.xx.xx).newInstance(), the result will same as calling Class.forName(xxx.xx.xx), because Class.forName(xxx.xx.xx).newInstance() will load driver first, and then create instance, but the instacne you will never use in usual, so you need not to create it

分享到:
评论

相关推荐

    JDBC详解HTML-JDBC.pp

    <2>.Class.forName(driver).newInstance() <3>.new driver() 2>.取得数据库连接(Connect to the DataBase) <1>.用DriverManager取数据库连接 Connection cn = DriverManager.getConnection(url,uid,pwd); <2>....

    JDBC 连接MySQL实例详解

    Class.forName(“com.mysql.jdbc.Driver”); Class.forName(“com.mysql.jdbc.Driver”).newInstance(); JDBC URL 定义驱动程序与数据源之间的连接 标准语法: <protocol>:<subprotocol>: MySQL的JDBC URL格式:...

    Java开发中连接数据库的方法和详解

     在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机),这通过java.lang.Class类的静态方法forName(String className)实现。  例如:  try{  //加载MySql的驱动类  Class.forName(...

    spring chm文档

    Copies of this document may be made for your own use and for distribution to others, provided that you do not charge any fee for such copies and further provided that each copy contains this Copyright...

    J2EE应用开发详解

    29 3.2.2 Class.forName()加载类的实例 30 3.2.3 loadClass获得类的实例 31 3.3 操作类的字段 31 3.3.1 获取对象的属性 31 3.4 操作类的方法 34 3.4.1 运行时调用对象的方法 34 3.4.2 无参构造函数 36 3.4.3 带参...

    jpivot学习总结.doc

    该标签的主要作用是让 mondrian 执行指定的查询,该标签需要指定一个 JDBC 的 datasource 或单独指定 JDBC 连接的各个属性从而可以让 mondrian 连接到指定的数据库。 它的用法如下: jdbcDriver=...

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    【反射】反射中,Class.forName和classloader的区别 42 【JVM】JAVA编译原理和JVM原理 42 【JVM】Java内存模型 44 【JVM】jvm内存模型 45 主内存与工作内存 45 内存间交互操作 46 重排序 48 【JVM】内存泄漏 49 ...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    1.4.1 类(Class):Java世界中一类物体 14 1.4.2 方法(Method):物体的功能 15 1.4.3 main()方法:所有Java程序执行的起点 15 .1.5 名词解释 16 1.5.1 JDK和Java平台 16 1.5.2 Java编译器(Java Compiler)...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    1.4.1 类(Class):Java世界中一类物体 14 1.4.2 方法(Method):物体的功能 15 1.4.3 main()方法:所有Java程序执行的起点 15 .1.5 名词解释 16 1.5.1 JDK和Java平台 16 1.5.2 Java编译器(Java Compiler)...

Global site tag (gtag.js) - Google Analytics