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

JDBC Class.forName作用(转)

阅读更多

 

 使用JDBC时,我们都会很自然得使用下列语句:

 

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


    为什么说很自然呢,因为无论是网上还是书本教程上得例子都是这样的,而且程序也确实正常运行了,于是大家也就心安理得的找葫芦画瓢下去了。

    一定要有这一句吗?不是的,我们完全可以用这样一句代替它:

 

com.mysql.jdbc.Driver driver = new com.mysql.jdbc.Driver();    
//or:    
//new com.mysql.jdbc.Driver();    
String url = "jdbc:mysql://127.0.0.1/test?useUnicode=true&characterEncoding=utf-8";    
String user = "";    
String psw = "";    
Connection con = DriverManager.getConnection(url,user,psw);    
 

 


    大家可能都看出个大概来了,我们只需要在调用DriverManager的getConnection方法之前,保证相应的Driver类已经被加载到jvm中,并且完成了类的初始化工作就行了,而具体是怎样实现这个功能却是没有讲究的。上面两种方法都可以实现这个功能,因此程序可以正常运行。注意了,如果我们进行如下操作,程序是不能正常运行的,因为这样仅仅使Driver类被装载到jvm中,却没有进行相应的初始化工作。

 

com.mysql.jdbc.Driver driver = null;    
//or:    
ClassLoader cl = new ClassLoader();    
cl.loadClass("com.mysql.jdbc.Driver");  
 

 

     我们都知道JDBC是使用Bridge模式进行设计的,DriverManager就是其中的Abstraction,java.sql.Driver是Implementor,com.mysql.jdbc.Driver是Implementor的一个具体实现(请参考GOF的Bridge模式的描述)。大家注意了,前一个Driver是一个接口,后者却是一个类,它实现了前面的Driver接口。

     Bridge模式中,Abstraction(DriverManager)是要拥有一个Implementor(Driver)的引用的,但是我们在使用过程中,并没有将Driver对象注册到DriverManager中去啊,这是怎么回事呢?jdk文档对Driver的描述中有这么一句:

     When a Driver class is loaded, it should create an instance of itself and register it with the DriverManager 

哦,原来是com.mysql.jdbc.Driver在装载完后自动帮我们完成了这一步骤。源代码是这样的:

 

package com.mysql.jdbc    
   
public class Driver extends NonRegisteringDriver implements java.sql.Driver {    
 // ~ Static fields/initializers    
 // --------------------------------------------- //    
 // Register ourselves with the DriverManager    
 //    
 static {    
    t ry {    
              java.sql.DriverManager.registerDriver(new Driver());    
          } catch (SQLException E) {    
              throw new RuntimeException("Can't register driver!");    
          }    
  }    
// ~ Constructors    
 // -----------------------------------------------------------    
/**   
  * Construct a new driver and register it with DriverManager   
  *    
  * @throws SQLException   
  *             if a database error occurs.   
  */   
 public Driver() throws SQLException {    
     // Required for Class.forName().newInstance()    
 }    
}

 可以看到DriveManager里面定义了静态方法,而mysql等驱动类都是内部用静态数据块的方式来初始化,完成Driver对象注册到DriverManager中,所以只要jvm装载了这些驱动类就会将Driver对象注册到DriverManager中去(Class.forName(xxx.xx.xx) 返回的是一个类;Class.forName(xxx.xx.xx);的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段 。静态代码是和class绑定的,class装载成功就表示执行了你的静态代码了。而且以后不会再走这段静态代码了。),后面就可以直接使用了

分享到:
评论

相关推荐

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

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

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

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

    jdbc中class.forname的作用

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

    sqlserver驱动包 jdbc驱动 sqljdbc.jar和sqljdbc4.jar

    1. 加载驱动:使用Class.forName()方法加载JDBC驱动类。 ```java Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); ``` 2. 创建连接:使用DriverManager.getConnection()方法,传入数据库URL、...

    sqljdbc42.jar

    使用sqljdbc42.jar,你需要在Java代码中通过Class.forName()加载驱动,然后使用DriverManager.getConnection()创建数据库连接。以下是一个简单的示例: ```java import ...

    jdbc连接使用jar包 Access_JDBC40.jar

    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); ``` 3. **创建数据库连接**:接下来,使用`DriverManager.getConnection()`方法建立到Access数据库的连接。你需要提供数据库的URL,用户名(如果需要)和密码。...

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

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

    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操作MySQL需要添加Class.forName("com.mysql.jdbc.Driver")

    当我们使用JDBC操作MySQL数据库时,通常会在代码中看到`Class.forName("com.mysql.jdbc.Driver")`这一行,这行代码的作用是至关重要的,但很多人可能并不清楚为什么要这样做。本文将深入探讨这个问题,以及其背后的...

    sun.jdbc.odbc.JdbcOdbcDriver.zip

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

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

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

    sqljdbc4.jar程序文件

    Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); Connection conn = DriverManager.getConnection( "jdbc:sqlserver://localhost:1433;databaseName=myDB", "username", "password"); ``` 这段...

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

    sun.jdbc.odbc.JdbcOdbcDriver下载

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

    sun.jdbc.odbc.jdbcodbcdriver-Maven.zip

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

    sqljdbc4.jar

    2. **建立连接**:使用`Class.forName()`方法加载驱动,例如:`Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver")`。 3. **创建连接**:使用`DriverManager.getConnection()`方法创建数据库连接,...

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

    access_jdbc3.0.jar驱动+代码.zip

    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); ``` 这行代码告诉Java虚拟机(JVM)使用JDBC-ODBC桥驱动。 2. 创建数据库连接: ```java Connection conn = DriverManager.getConnection("jdbc:odbc:...

    sqljdbc.jar和sqljdbc4.jar

    2. 配置连接:使用`Class.forName()`方法加载驱动,例如`Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");` 3. 创建连接:使用`java.sql.DriverManager.getConnection()`方法创建数据库连接,提供...

    sqljdbc41.jar和mysql-connector-java-5.1.13-bin.jar

    Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); Connection conn = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;databaseName=myDB", "username", "password"); ``` 而对于...

Global site tag (gtag.js) - Google Analytics