JDBC详解系列之加载驱动

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDBC详解系列之加载驱动相关的知识,希望对你有一定的参考价值。

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

??在JDBC详解系列(一)之流程中,我将数据库的连接分解成了六个步骤。

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-INF\services\java.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/78838091)---








以上是关于JDBC详解系列之加载驱动的主要内容,如果未能解决你的问题,请参考以下文章

JDBC 使用详解

JDBC详解学习文档

JDBC详解学习文档

关于mysql驱动版本报错解决,Cause: com.mysql.jdbc.exceptions.jdbc4Unknown system variable ‘query_cache_size(代码片段

JDBC详解1

使用JDBC连接数据库详解