传统的使用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”)

    原文:http://www.cnblogs.com/gaojing/archive/2012/03/23/2413638.html 传统的使用jdbc来访问数据库的流程为: Class.forName ...

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

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

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

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

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

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

  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. 标记扩展和 WPF XAML

      本主题介绍 XAML 的标记扩展概念,包括其语法规则.用途以及底层的类对象模型. 标记扩展是 XAML 语言以及 XAML 服务的 .NET 实现的常规功能. 本主题专门详细论述了用于 WPF X ...

  2. MySQL数据库起步 关于数据库的基本操作(更新中...)

    mysql的基本操作 连接指定的服务器(需要服务器开启3306端口) mysql -h ip地址 -P 端口号 -u 账号 -p 密码 删除游客模式 mysql -h ip地址 -P 端口号 -u 账 ...

  3. neo4j遍历和图算法

    阅读更多 这篇blog主要和大家分享一下neo4j中是如何对节点进行遍历,和其中集成的图论的一些常用算法. 遍历 http://docs.neo4j.org.cn/tutorials-java-emb ...

  4. dedecms list标签调用附加表字段--绝对成功

    使用list标签调用附加表字段的时候会忽略一个地方,明明附加字段名已经添加进去了就是调用不出来 经过在网上查询了资料,说的天花乱坠,也都实践过一些,但是就是不成功鞋面介绍一下犯的低级错误在哪里 {de ...

  5. python Pandas文件读写

  6. pycharm中引入相对路径错误

    真是气死老子了,明明代码就在眼前,居然pycharm说找不到,import报错,最后才发现,需要设置代码的根目录,因此,python代码就在app目录下面,故将app设置成代码根目录就行了

  7. jquery 调用asp.net后台代码

    1.需要引用对应的命名空间 System.Web.Services 2.后台方法: 必须是static 约束   必须添加[WebMethod()] 属性 示例: <script type=&q ...

  8. JetBrains PyCharm 2017.2 字体放大缩小 功能

  9. 洛谷 3398 仓鼠找sugar——树链剖分

    题目:https://www.luogu.org/problemnew/show/P3398 原来只要把值记录成第几次就行了. 别忘了while(top[a]!=top[b])之后还要走一步. #in ...

  10. SQL Server导入数据报错"无法在只读列“Id”中插入数据"

    使用sql server 导入数据报错:无法在只读列'id'中插入数据.如下图所示: 查找出现该问题的原因是表中id为自动增长的标识列,需要在[编辑映射]中勾选"启用标识插入": ...