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
- JDBC详解系列(二)之加载驱动
- JDBC系列教程(二)---驱动设置
- JDBC系列教程(二)---驱动设置
- JDBC系列教程(二)---驱动设置
- 老调重弹:JDBC系列 之 <驱动加载原理全面解析>
- 老调重弹:JDBC系列之<驱动加载原理全面解析)
- 老调重弹:JDBC系列 之 <驱动加载原理全面解析>
- JDBC系列之<驱动加载原理全面解析)
- linux驱动由浅入深系列:驱动程序的基本结构概览之二(详解驱动注册过程)
- JDBC详解系列(一)之流程
- jdbc详解(二)
- jdbc详解(二)
- JDBC驱动加载程序
- 【JDBC】加载驱动异常
- JDBC驱动加载原理
- jdbc驱动加载失败
- JDBC驱动类加载
- JDBC驱动加载全过程
- 数据结构-树
- 用 Opencv 和 Python 对狗狗做模糊检测
- Ubuntu 16.04下安装SQL Server for Linux
- 静态链表相关算法学习
- jsTree使用记录
- JDBC详解系列(二)之加载驱动
- 12-23三道题
- while的一个小问题
- 为什么他月入10w我月入5k?程序员如何实现财富自由?
- 对应的服务器 TLS 为 TLS 1.0 ,小程序程序要求的 TLS 版本必须大于等于 1.2
- Apache默认虚拟主机
- 数据类型总结
- c++入门笔记(12)面向对象语言
- 维吉尼亚密码暴力破解c++实现