关于用Class.forName(“com.mysql.jdbc.Driver”)注册数据库驱动_<% try { // 加载数据库驱动,注册到驱动管理器 class.forname("com.my-程序员宅基地

技术标签: java笔记  mysql  jdbc  数据库  

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_31202403/article/details/70545311

智能推荐

RocketMQ生产部署-程序员宅基地

文章浏览阅读335次。本文英文原文来自RocketMQ官方部署文档文章目录前提准生产环境部署命名服务代理服务配置代理服务配置命令行管理工具如何访问如何使用复制模式复制:同步/异步 代理服务如何配置部署本章节介绍了准生产环境部署方案。综合来讲,我们要部署一套弹性伸缩并且没有单点故障的RocketMQ集群。前提开始本章之前,你需要先了解过快速开始,并且熟悉RocketMQ的组件和核心概念。准生产环境部署命名..._rocketmq生产部署

通过矩形的中心坐标与原顶点坐标以及旋转角度计算矩形的旋转后4个顶点的位置...-程序员宅基地

文章浏览阅读4.9k次。x2 = cos(q)(x1-x0) – sin(q)(y1-y0) + x0;y2 = sin(q)(x1-x0) + cos(q)(y1-y0) + y0;其中,q表示矩形的旋转角度,x1表示矩形的原顶点横坐标,x0表示矩形的中心坐标转载于:https://www.cnblogs.com/greystone/p/10115293.html..._c++长方形旋转求顶点坐标

springboot-shiro中的问题_shiro cachingenabled-程序员宅基地

文章浏览阅读1.3k次,点赞2次,收藏2次。assertCredentialsMatch_shiro cachingenabled

如何修复注册表!-程序员宅基地

文章浏览阅读2.7k次,点赞2次,收藏5次。注册表修复 Windows 95开始,微软公司在Windows中引入了注册表(英文为REGISTRY)的概念(实际上原来在Windows NT中已经有此概念)。注册表是Windows95及Windows98的核心数据库,表中存放着各种参数,直接控制着Windows的启动、硬件驱动程序的装载以及一些 Windows应用程..._无法导入 \hkey_dyn_data.reg: 访问注册表时出错。

紫书笔记 - algorithm头文件_algorithm头文件 greater-程序员宅基地

文章浏览阅读520次。排序与检索sort :对给定区间所有元素进行排序头文件 :algorithm语法描述:sort(begin,end,cmp),cmp参数可以没有,如果没有默认非降序排序。  less<数据类型>()//从小到大排序  greater<数据类型>()//从大到小排序函数lower_bound()功能:函数lower_bound()..._algorithm头文件 greater

cmd执行python错误提示api-ms-win-crt-runtime-l1-1-0.dll 丢失_python api ms win-程序员宅基地

文章浏览阅读2.8k次。错误如下: 解决: 在micorsoft 官网下载下载KB2999226、KB3118401进行更新。KB2999226下载 进去KB2999226下载界面后这时我们可以看到各个系统的补丁下载,这里我们以win7 64位为例,如下图 KB3118401下载 进入下载界面后我们可以看到各个系统下的KB3118401下载地点,和KB2999226类似: 等两个都下载完了之后..._python api ms win

随便推点

【引用】DMA内存申请--dma_alloc_coherent_dma引用-程序员宅基地

文章浏览阅读2.8k次。在项目驱动过程中会经常用到dma传输数据,而dma需要的内存有自己的特点,一般认为需要物理地址连续,并且内存是不可cache的,在linux内核中提供一个供dma所需内存的申请函数dma_alloc_coheren. 如下所述:dma_alloc_coherent()dma_alloc_coherent() -- 获取物理页,并将该物理页的总线地址保存于dma_handle,返回该物理页的虚拟地址_dma引用

JAVA—— Linux(二)_java llinux-程序员宅基地

文章浏览阅读1.1k次。文章目录1 Linux文件管理1.1 touch命令1.2 vi与vim命令1.2.1 vi/vim介绍1.2.2 vi/vim模式1.2.3 打开和新建文件1.2.4 三种模式切换1.2.5 文件查看**1) cat命令**2) grep命令3) tail命令4)less命令1.2.6 vim定位行**1.2.7 异常处理**1.2.8 操作扩展1.3 echo 命令第二步: 将**命令的成功结果** **追加** 指定文件的后面第三步: 将**命令的失败结果** **追加** 指定文件的后面1.4 _java llinux

使用PHP ping域名或IP_是什么/php/ping.php?hostname=|dir-程序员宅基地

文章浏览阅读1.3w次。废话没有,直接贴代码。<?php/** * 使用PHP检测能否ping通IP或域名 * @param type $address * @return boolean */function pingAddress($address) { // Windows 服务器下 $pingresult = exec("ping -n 1 {$address}", $outco_是什么/php/ping.php?hostname=|dir</div>

GPU GEMS 3 EBOOK下载-程序员宅基地

文章浏览阅读200次。GPU GEMS 3已经发行了很久了,但始终没有找到下载。今天终于找到了电子版下载地址,比以前1、2的电子版好很多,是CHM格式的,很清晰。国内下载地址见:http://www.itpub.net/viewthread.php?tid=952477另最新提供网络硬盘的下载地址:http://www.fs2you.com/zh-cn/files/6710f94c-0234-11dd-99af..._gpu gems 3下载

计算机基础知识章节教学目标,精选计算机教学计划三篇-程序员宅基地

文章浏览阅读776次。精选计算机教学计划三篇光阴迅速,一眨眼就过去了,迎接我们的将是新的生活,新的挑战,是时候开始制定计划了。那么计划怎么拟定才能发挥它最大的作用呢?以下是小编为大家整理的计算机教学计划3篇,欢迎大家分享。计算机教学计划 篇1一、课程性质本课程是计算机专业中一门重要的专业技术课程。重点介绍计算机网络的基础知识和组网方法。全书共由9个章节组成。介绍了数据通信基础知识、网络体系结构、TCPIP等协议的结构及..._计算机课程的教学目标

Exceptional Performance : Best Practices for Speeding Up Your Web Site_this provides the exceptional performance expected-程序员宅基地

文章浏览阅读1.7k次。原贴:http://developer.yahoo.com/performance/rules.html#expiresExceptional Performance : Best Practices for Speeding Up Your Web Site High Performance Web Sites by Steve Souders, Chief Performan_this provides the exceptional performance expected

推荐文章

热门文章

相关标签