zoukankan      html  css  js  c++  java
  • JDBC详解系列(二)之加载驱动

    ---[来自我的CSDN博客](http://blog.csdn.net/weixin_37139197/article/details/78848637)---

      在[JDBC详解系列(一)之流程](http://blog.csdn.net/weixin_37139197/article/details/78838091)中,我将数据库的连接分解成了六个步骤。 >JDBC流程: 第一步:加载Driver类,注册数据库驱动; 第二步:通过DriverManager,使用url,用户名和密码建立连接(Connection); 第三步:通过Connection,使用sql语句打开Statement对象; 第四步:执行语句,将结果返回resultSet; 第五步:对结果resultSet进行处理; 第六步:倒叙释放资源resultSet-》preparedStatement-》connection。

      接着将第一步的加载数据库驱动讲解一下。加载驱动就是这一句代码啦:

    public static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
    Class.forName(JDBC_DRIVER);
    //以上也可以直接替换为 new com.mysql.jdbc.Driver();
    

      Class.forName(String className)返回的是一个类,在这个过程中,会把该类加载到jvm中,即这个类的静态代码会执行。为什么不使用new com.mysql.jdbc.Driver()这种方式呢?

    如果使用new com.mysql.jdbc.Driver()这种方式,会对这个具体的类产生依赖。后续如果你要更换数据库驱动,就得重新修改代码。而使用反射的方式,只需要在配置文件中,更改相应的驱动和url即可。

      加载驱动的过程中,发生了什么?我们来看一下mysql的驱动类代码。

    public class Driver extends NonRegisteringDriver implements java.sql.Driver {
        //
        // Register ourselves with the DriverManager
        //
        static {
            try {
                java.sql.DriverManager.registerDriver(new Driver());
            } catch (SQLException E) {
                throw new RuntimeException("Can't register driver!");
            }
        }
    
        /**
         * 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()
        }
    

      ok,就是说其实起作用的是这一句代码:

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

      查看了一下registerDriver的源码,大致是如果DriverManager中没有这个类,就将这个类添加到到DriverManager的list中。在实际的使用过程中,我们完全可以用上面这一句代码将下面加载驱动的代码替换掉,但也会对具体的类产生依赖,导致后续更改不便。

    Class.forName(JDBC_DRIVER);
    

      到此,我想测试一下把加载驱动的代码去掉,然后看会报什么错误。结果竟然没问题。这是在逗我吗?书里面不是这么教的。只能进行google了,原因如下:

    JDBC4.0以后新增了新特性:JDBC4.0不再需要显示调用class.forName()注册驱动,DriverManager初始化中会通过ServiceLoader类,在我们classpath中jar(数据库驱动包)中查找,使用META-INFservicesjava.sql.Driver文本中的类名称去注册。

      也就说,在启动的时候,通过jar包下面的java.sql.Driver里的文本内容,帮你把驱动给加载了。
      OK,明白了这个之后,我将mysql驱动jar包中java.sql.Driver中的文本内容删除了,然后就将Class.forName(JDBC_DRIVER)注释掉,果然报错了:

    java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/jdbc_test

      

    ---[来自我的CSDN博客](http://blog.csdn.net/weixin_37139197/article/details/78848637)---

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    LongAdder和AtomicLong性能对比
    2,linux入门到上手-ssh安装配置及虚拟机基本使用
    markdown反射型xss漏洞复现
    快速构建第三方api应用
    PHP使用Redis
    laravel aritisan命令大全
    laravel5.5的服务容器分析
    【笔记JS/HTML/CSS】用div实现个性化button,背景半透明
    【GIMP学习】抠图方法二则
    【ubuntu】中文输入法安装二三事
  • 原文地址:https://www.cnblogs.com/homejim/p/8076481.html
Copyright © 2011-2022 走看看