原文:http://www.cnblogs.com/gaojing/archive/2012/03/23/2413638.html

传统的使用jdbc来访问数据库的流程为:

Class.forName(“com.mysql.jdbc.Driver”);

String url = “jdbc:mysql://localhost:3306/test?user=root&password=123456″;

Connection con = DriverManager.getConnection(url);

Statement statement = con.createStatement();

最开始使用的时候,不明白为什么首先要加载一个驱动类,之后就可以取得了Connection了,很好奇DriverManager是怎么获得那个驱动类的信息,后来看了下com.mysql.jdbc.Driver这个类的源代码,豁然开朗了。原来在com.mysql.jdbc.Driver类中有这么一段静态初始化代码:

static {

   try {

     java.sql.DriverManager.registerDriver(new Driver());

  } catch (SQLException E) {

    throw new RuntimeException(“Can’t register driver!”);

  }

}

也就是,在Class.forName加载完驱动类,开始执行静态初始化代码时,会自动新建一个Driver的对象,并调用DriverManager.registerDriver把自己注册到DriverManager中去。

ps1: Class.forName(String) 与ClassLoader.loadClass(String)的区别

Class.forName(String): 加载类,并且执行类初始化;可以通过Class.forName(String, boolean, ClassLoader)第二个参数来仅仅加载类不执行初始化; ClassLoader.loadClass(String): 仅仅加载类,不执行类初始化;

ps2: 有时会看到这种用法: Class.forName(“com.mysql.jdbc.Driver”).newInstance();

这是没有必要的,正如前述,静态初始化已经new了一个Driver的对象,注册到DriverManager中去,在此再建立一个Driver对象则是完全没有必要的,浪费空间。

ps3: 结合ps1,Class.forName(“com.mysql.jdbc.Driver”);

相当于: ClassLoader loader = Thread.currentThread().getContextClassLoader(); Class cls = loader.loadClass(“com.mysql.jdbc.Driver”); cls.newInstance(); 这种方法的问题同ps2, 浪费了一个Driver对象;

ps4: 在java 6中,引入了service provider的概念,即可以在配置文件中配置service(可能是一个interface或者abstract class)的provider(即service的实现类)。

配置路径是:/META-INF/services/下面。详细信息见:http://docs.oracle.com/javase/6/docs/technotes/guides/jar/jar.html#Service%20Provider

而java.sql.DriverManager也添加了对此的支持,因此,在JDK6中,DriverManager的查找Driver的范围为:

  1)system property “jdbc.drivers” 中配置的Driver值;

  2)用户调用Class.forName()注册的Driver

   3)service provider配置文件java.sql.Driver中配置的Driver值。

   因此,在jdk6中,其实是可以不用调用Class.forName来加载mysql驱动的,因为mysql的驱动程序jar包中已经包含了java.sql.Driver配置文件,并在文件中添加了com.mysql.jdbc.Driver.但在JDK6之前版本,还是要调用这个方法。

参考文档: 1)http://docs.oracle.com/javase/1.5.0/docs/api/java/sql/DriverManager.html 2)http://docs.oracle.com/javase/6/docs/api/index.html?java/sql/DriverManager.html 3)http://docs.oracle.com/javase/6/docs/technotes/guides/jar/jar.html#Service%20Provider

【转】关于Class.forName(“com.mysql.jdbc.Driver”)的更多相关文章

  1. Class.forName("com.mysql.jdbc.Driver") ;

    try { Class.forName("com.mysql.jdbc.Driver") ; } catch(ClassNotFoundException e) { System. ...

  2. Class.forName("com.mysql.jdbc.Driver");的作用

    对于大的项目当然我们都已经有了原有基本框架,但是对于一些新的技术探讨的时候,我们还是直接调用Class.forName("com.mysql.jdbc.Driver")连接数据库进 ...

  3. 关于Class.forName(“com.mysql.jdbc.Driver”)--转

    传统的使用jdbc来访问数据库的流程为:Class.forName(“com.mysql.jdbc.Driver”);String url = “jdbc:mysql://localhost:3306 ...

  4. 为什么使用JDBC操作MySQL需要添加Class.forName("com.mysql.jdbc.Driver")

    引言 如果熟悉使用JDBC来连接数据库的同学一定很清楚连接数据库的代码中一定会有依据Class.forName("com.mysql.jdbc.Driver"); public s ...

  5. Class.forName(“com.mysql.jdbc.Driver”)

    传统的使用jdbc来访问数据库的流程为: Class.forName(“com.mysql.jdbc.Driver”); String url = “jdbc:mysql://localhost:33 ...

  6. Class.forName("com.mysql.jdbc.Driver")找不到类

    解决方法: 如果是java项目,只需要引入mysql-connector-java-8.0.13.jar就可以运行java项目. 建的如果是web工程,需要把mysql-connector-java- ...

  7. 解决"java.lang.ClassNotFoundException: com.mysql.jdbc.Driver"

    按照以前的老方法,写Java的主程序通过JDBC来连MySQL. //1: import java.sql.*; import java.sql.*; public class JDBC_Driver ...

  8. java.lang.ClassNotFoundException: com.mysql.jdbc.Driver问题

    java.lang.ClassNotFoundException: com.mysql.jdbc.Driverat org.apache.catalina.loader.WebappClassLoad ...

  9. jdbc连接mysql加载驱动程序com.mysql.jdbc.Driver

    在开发环境如eclipse,中加载指定数据库的驱动程序.需要下载MySQL支持JDBC的驱动程序mysql-connector-java-5.1.25-bin.jar. 而具体在Java程序中加载驱动 ...

随机推荐

  1. Mysql数据库的通用安装方法

    安装方式简介 Mysql数据库也时不时的用过一段时间,具体使用的功能都比较浅显,没有具体深入学习.最近一段在公司部署iNeedle系统时经常避免不了要安装apache和Mysql数据库.一般Mysql ...

  2. 地图编辑器V2.3

    MapEditorV2.3 changelog: ====================================== V2.9.0 (2013-11-18)----------------- ...

  3. Remove Duplicates From Sorted Array

    Remove Duplicates from Sorted Array LeetCode OJ Given a sorted array, remove the duplicates in place ...

  4. 《Python核心编程》部分代码习题实践(持续更新)

    第三章 3-10 交换异常处理方式 代码: #makeTextFile.py #!/usr/bin/env python 'makeTextFile.py' import os ls = os.lin ...

  5. UVA 12716 GCD XOR【异或】

    参考:http://www.cnblogs.com/naturepengchen/articles/3952145.html #include<stdio.h> #include<s ...

  6. Student管理系统

    使用三层架构实现Student管理系统,分为Studrnt.Model层,Student.DAL层,Student.BLL层和Student.UI层 步骤分析: 1.在Student.Model添加S ...

  7. [No000019]不想背单词?看看游戏能否帮你

  8. http协议(十)实体首部字段

    1.定义 包含在请求和响应中的实体部分所使用的首部,用于补充内容的更新时间等与实体相关的信息 2.Allow 通知客户端能够支持的Request-URI指定资源的所有http方法 如果服务器接收到不支 ...

  9. NOIP2016提高组解题报告

    NOIP2016提高组解题报告 更正:NOIP day1 T2天天爱跑步 解题思路见代码. NOIP2016代码整合

  10. DWZ中Tree树形菜单的treeCheck如何获取返回值解决方案

    最近在对DWZ和asp.net MVC3进行整合,其中遇到了很多问题,总算一一解决了,今天就说说题目所示的问题解决方案. 想做一个基于角色的权限管理,要对每一个Action进行权限控制.就想用DWZ的 ...