JDBC详解系列(二)之加载驱动

来源:互联网 发布:30岁开始学编程 编辑:程序博客网 时间:2024/05/23 01:12

  在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

  

原创粉丝点击