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

Java牛角尖【012】: JDBC开发时为什么要用Class.forName("")

阅读更多

前几天看到一个帖子中提出一个问题,在JDBC的开发中为什么要使用Class.forName,可以不用这句吗?

  我们从代码出发,来分析一下这个问题。

  下面是一段我们常用的JDBC开发中的代码(注:本文中例子使用Mysql为例子。为方便演示,代码中忽略异常处理)

 

  1. Class.forName("com.mysql.jdbc.Driver");  
  2. conn = DriverManager.getConnection(  
  3.         "jdbc:mysql://localhost:3306/mysql""root""");  
  4. stmt = conn.createStatement();  
  5. rs = stmt.executeQuery("select count(0) from user");  
  6. while (rs != null && rs.next()) {  
  7.     System.out.println(rs.getInt(1));  
  8. }  

 

  运行代码,结果正常,打印出了Mysql数据库中的用户数。

  我们先尝试将第一句拿掉,看是不是也可以运行。

 

  1. // 拿掉Class.forName语句,看一下运行结果  
  2. // Class.forName("com.mysql.jdbc.Driver");  
  3. conn = DriverManager.getConnection(  
  4.         "jdbc:mysql://localhost:3306/mysql""root""");  
  5. stmt = conn.createStatement();  
  6. rs = stmt.executeQuery("select count(0) from user");  
  7. while (rs != null && rs.next()) {  
  8.     System.out.println(rs.getInt(1));  
  9. }  

 

  运行代码,报如下错误:

 

  1. java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/mysql  
  2.     at java.sql.DriverManager.getConnection(DriverManager.java:602)  
  3.     at java.sql.DriverManager.getConnection(DriverManager.java:185)  
  4.     at net.moon.jdbc.demo.Demo.main(Demo.java:18)  

 

  看来是不行,那让我们来分析一下,Class.forName(String clz)这样一个方法到底做了什么呢?

  看一下API,API中Class.forName方法的声明如下:

 

  1. public static Class<?> forName(String className)  
  2.                         throws ClassNotFoundException  

 

  该方法是根据一个字符串,得到这个字符串所表示的类,但是我们上面代码中并没有一个引用指向这个返回的结果,也就是代码并不关注返回的结果,那为什么还要执行这句话呢,继续往下看API中的说明,有这样一句:“A call to forName("X") causes the class named X to be initialized”。

  问题似乎有点眉目了,原来在执行Class.forName("com.mysql.jdbc.Driver")这个语句时,com.mysql.jdbc.Driver这个类被初始化了,那一定是在初始化中做了什么动作。为了证实这点,我们对上面的代码做一点修改:

 

  1. // Class.forName("com.mysql.jdbc.Driver");  
  2. // 新建一个Driver对象,同样不关注返回的结果  
  3. new com.mysql.jdbc.Driver();  
  4. conn = DriverManager.getConnection(  
  5.         "jdbc:mysql://localhost:3306/mysql""root""");  
  6. stmt = conn.createStatement();  
  7. rs = stmt.executeQuery("select count(0) from user");  
  8. while (rs != null && rs.next()) {  
  9.     System.out.println(rs.getInt(1));  
  10. }  

 

  运行代码,和预想的一样,同样可以得到运行结果。

  我们再来想一下,com.mysql.jdbc.Driver这个类在初始化的时候到底执行了什么?先来回忆一下以前的一篇文章:Java牛角尖【003】:类初始化时的执行顺序。明白了,好像有这样一个概念:静态代码块。

  一定是在com.mysql.jdbc.Driver这个类中有一段静态代码段,这段代码执行了某些动作。

  之所以用Mysql做为例子,还有另外一个优点,那就是开源,开源也就是说我们可以看到它的代码,所以下个任务就是找到com.mysql.jdbc.Driver这个类的源码来看一下了。

  代码如下:

 

  1. static {  
  2.     try {  
  3.         java.sql.DriverManager.registerDriver(new Driver());  
  4.     } catch (SQLException E) {  
  5.         throw new RuntimeException("Can't register driver!");  
  6.     }  
  7. }  

 

  这段代码似乎比我们想象的要简单,是透过java.sql.DriverManager这个类的静态方法registerDriver这个方法注册这个JDBC驱动。

  最后一个问题就是为什么这里要调用registerDriver方法呢,那就是来看一下DrvierManager的API了,如下:

 

  1. registerDriver  
  2. public static void registerDriver(Driver driver)  
  3.                            throws SQLException  
  4.   
  5. 向 DriverManager 注册给定驱动程序。新加载的驱动程序类应该调用 registerDriver 方法让 DriverManager 知道自己。   
  6.   
  7. 参数:  
  8. driver - 将向 DriverManager 注册的新的 JDBC Driver   
  9. 抛出:   
  10. SQLException - 如果发生数据库访问错误  

 

分享到:
评论

相关推荐

    行业文档-设计装置-一种打磨成仿牛角尖外形的笔尖.zip

    在本设计装置中,我们探讨了一种创新的工艺方法,用于将笔尖打磨成仿牛角尖的外形。这种设计不仅在视觉上提供了独特的审美体验,还可能改善书写时的手感和性能。以下是对这个技术的详细阐述: 1. 设计理念:仿牛角...

    电子:中国半导体:牛角峥嵘.pdf

    在深入解读《电子:中国半导体:牛角峥嵘》这篇报告之前,首先要明确几个核心的概念。首先,半导体是指那些在特定温度下导电性能介于导体和绝缘体之间的材料,常被应用于制造各种电子设备的微小组件中,如晶体管、...

    基于Solidworks的牛角芯棒CAD系统的二次开发.pdf

    这篇文章主要讨论了如何基于Solidworks平台,通过VB语言开发牛角芯棒的参数化快速设计系统,为牛角芯棒的设计提供了一种更为便捷的方法。 首先,我们来了解一下Solidworks。Solidworks是一款流行的三维机械设计软件...

    电子:中国半导体:牛角峥嵘.zip

    标题“电子:中国半导体:牛角峥嵘”揭示了这篇文档可能主要探讨的是中国在电子半导体领域的快速发展和崛起。描述中的“牛角峥嵘”是中国成语,用来形容事物发展势头强劲,暗示中国的半导体产业正展现出强大的竞争力...

    牛角包::croissant:轻巧却有用的BukkitSpigotPaper插件库

    介绍Croissant是一个轻量级的Java库,它为Bukkit / Spigot / Paper插件提供了命令框架和GUI框架。 以下是其功能的简短摘要: 命令框架无需在插件的plugin.yml文件中声明命令自动参数解析和制表符补全从推断参数可以...

    电子行业深度:半导体:历史级别景气继续演绎.pdf

    从“全球芯拐点”到“中国电子:重构与崛起”,再到“半导体:厉兵秣马,迈入芯征程”和“中国半导体:牛角峥嵘”,分析报告预测了该行业将进入一个长期的繁荣期。 其次,半导体产业在2021年第一季度的表现尤为出色...

    java注解方式实现拦截接口重复提交

    在Java编程中,注解(Annotation)是一种元数据,它提供了在代码中插入信息的方式,这些信息可以被编译器或运行时环境用来执行特定的动作。在这个场景中,"java注解方式实现拦截接口重复提交"是为了解决一个常见的...

    简易牛角座.IntLib

    简易牛角座.IntLib

    elasticsearch5.3集成java所需jar包

    首先,Elasticsearch本身是用Java编写的,因此Java运行时环境(JRE)是运行Elasticsearch的先决条件。你需要确保你的系统上安装了Java 8(JDK 1.8),因为Elasticsearch 5.x版本与这个版本的JVM兼容性最好。 在"lib...

    鸿蒙项目,用鸿蒙技术开发的项目

    5. 牛角书:这里提到的“牛角书”可能是指学习资源或教程,它可能为开发者提供关于鸿蒙项目和开发过程的详细指南,包括最佳实践、案例分析和常见问题解答,帮助开发者快速上手鸿蒙开发。 6. 跨平台开发:鸿蒙项目的...

    牛角按摩梳使用方法.pdf

    很抱歉,由于提供的文件信息中【部分内容】中仅包含了一串数字,并...如果您能提供更具体的内容或详细说明文件中牛角按摩梳的使用方法,我将很乐意为您生成所需的知识点。请补充相关信息以便我能够准确回答您的需求。

    OpenOffice 实现JPG.DOC转PDF转SWF在线预览(Java版)

    本文将详细介绍如何使用OpenOffice在Java环境下实现JPG图片和DOC文档转换为PDF,并进一步将PDF转换为SWF,以便进行在线预览。我们将讨论相关的技术、工具以及具体的实现步骤。 首先,OpenOffice是一款开源的办公...

    原牛角源码(修罗bbs)全站程序打包带数据库备份

    原牛角源码(修罗bbs)全站程序打包带数据库备份,牛角源码全站数据+全站文件、插件打包分享给大家,有兴趣的可以搭建玩玩! conf文件夹中自己配置数据库链接文件,默认管理账号:admin,密码123456 首页登录后就可以...

    牛角弯头三维CAD展开放样.pdf

    在钣金加工领域中,牛角弯头是一种特殊的弯管部件,主要用于输送管道系统中,以便连接不同直径的管道或调整管道方向。牛角弯头通常由多个圆锥形的管节组成,每个管节都有一定的弯曲角度和长度。由于其结构的复杂性,...

    水牛角生产工艺规程.pdf

    水牛角生产工艺规程.pdf

    牛角包素材.zip

    【标题】"牛角包素材.zip"所包含的是一份关于设计或烹饪领域的素材资源,很可能是用于制作广告、宣传材料或烘焙教学等用途。由于没有具体的标签信息,我们可以从"牛角包"这一主题出发,探讨与之相关的多个IT知识点。...

    电子:中国半导体:牛角峥嵘(2021)(173页).pdf

    电子:中国半导体:牛角峥嵘(2021)(173页).pdf

    C++编译的牛角棋

    【C++编译的牛角棋】是一款基于C++编程语言开发的游戏,它可能是为了帮助初学者实践编程技能而创建的。在这个项目中,我们能够看到开发者如何运用C++的基本语法、控制结构、函数和可能的数据结构来实现一个简单的...

    牛角包:Lu Lua REPL和调试器

    牛角包,一款专为Lua语言设计的交互式REPL(Read-Eval-Print Loop)和调试器,为程序员提供了强大的开发工具,使得在Lua编程过程中能够更加高效、便捷地进行代码测试、调试和学习。本文将深入探讨牛角包的功能特性、...

Global site tag (gtag.js) - Google Analytics