首页 > 试题广场 >

解释下驱动(Driver)在JDBC中的角色。

[问答题]
解释下驱动(Driver)在JDBC中的角色。
JDBC驱动提供了特定厂商对JDBC API接口类的实现,驱动必须要提供java.sql包下面这些类的实现:Connection, Statement, PreparedStatement,CallableStatement, ResultSet和Driver。
发表于 2015-10-29 12:10:42 回复(0)
更多回答
最开始使用的时候,不明白为什么首先要加载一个驱动类,之后就可以取得了Connection了,很好奇DriverManager是怎么获得那个驱动类的信息,后来看了下com.mysql.jdbc.Driver这个类的源代码,豁然开朗了。原来在com.mysql.jdbc.Driver类中有这么一段静态初始化代码:
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException(“Can’t register driver!”);
}
}
也就是,在Class.forName加载完驱动类,开始执行静态初始化代码时,会自动新建一个Driver的对象,并调用DriverManager.registerDriver把自己注册到DriverManager中去。
发表于 2017-08-14 22:58:04 回复(4)
一句话总结:在使用jdbc前,应该保证相应的Driver类已经被加载到jvm中,并且完成了类的初始化工作就行了 使用JDBC时,我们都会很自然得使用下列语句: java 代码 Class.forName("com.mysql.jdbc.Driver" ); String url = "jdbc:mysql://127.0.0.1/test?useUnicode=true&characterEncoding=utf-8" ; String user = "" ; String psw = "" ; Connection con = DriverManager.getConnection(url,user,psw); 为什么说很自然呢,因为无论是网上还是书本教程上得例子都是这样的,而且程序也确实正常运行了,于是大家也就心安理得的找葫芦画瓢下去了。 一定要有这一句吗?不是的,我们完全可以用这样一句代替它: java 代码 com.mysql.jdbc.Driver driver = new com.mysql.jdbc.Driver(); //or: //new com.mysql.jdbc.Driver(); String url = "jdbc:mysql://127.0.0.1/test?useUnicode=true&characterEncoding=utf-8" ; String user = "" ; String psw = "" ; Connection con = DriverManager.getConnection(url,user,psw); 大家可能都看出个大概来了,我们只需要在调用DriverManager的getConnection方法之前,保证相应的Driver类已经被加载到 jvm中,并且完成了类的初始化工作就行了,而具体是怎样实现这个功能却是没有讲究的。上面两种方法都可以实现这个功能,因此程序可以正常运行。注意了, 如果我们进行如下操作,程序是不能正常运行的,因为这样仅仅使Driver类被装载到jvm中,却没有进行相应的初始化工作。 java 代码 com.mysql.jdbc.Driver driver = null ; //or: ClassLoader cl = new ClassLoader(); cl.loadClass("com.mysql.jdbc.Driver" ); 我们都知道JDBC是使用Bridge模式进行设计的,DriverManager就是其中的Abstraction,java.sql.Driver是 Implementor,com.mysql.jdbc.Driver是Implementor的一个具体实现(请参考GOF的Bridge模式的描 述)。大家注意了,前一个Driver是一个接口,后者却是一个类,它实现了前面的Driver接口。 Bridge模式中,Abstraction(DriverManager)是要拥有一个Implementor(Driver)的引用的,但是我们在使 用过程中,并没有将Driver对象注册到DriverManager中去啊,这是怎么回事呢?jdk文档对Driver的描述中有这么一句: When a Driver class is loaded, it should create an instance of itself and register it with the DriverManager 哦,原来是com.mysql.jdbc.Driver在装载完后自动帮我们完成了这一步骤。源代码是这样的: java 代码 package com.mysql.jdbc public class Driver extends NonRegisteringDriver implements java.sql.Driver { // ~ Static fields/initializers // --------------------------------------------- // // Register ourselves with the DriverManager // static { t ry { java.sql.DriverManager.registerDriver(new Driver()); } catch (SQLException E) { throw new RuntimeException("Can't register driver!" ); } } // ~ Constructors // ----------------------------------------------------------- /** * 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() } }
发表于 2016-09-11 09:23:49 回复(7)
jdbc本身是一套接口,驱动其实就是它的实现类,只有提供了驱动才能与对应的数据库建立连接的通道,这样才能对数据库进行操作
发表于 2019-11-25 00:04:05 回复(1)
    JDBC是一套规范(通俗的说就是一套接口),它本身是没有针对具体数据库操作提供实现的, 所以谁要让自家的数据库适配JDBC,就实现这套接口即可. 
    一般叫实现JDBC规范的jar包为JDBC驱动(我们通过JDBC接口执行数据库操作命令,具体让数据库操作的是驱动程序).
发表于 2019-03-25 12:09:03 回复(1)
复制粘贴的不是人类本质,是XX本质
发表于 2019-08-01 15:26:50 回复(0)
   JDBC是一套规范(通俗的说就是一套接口),它本身是没有针对具体数据库操作提供实现的, 所以谁要让自家的数据库适配JDBC,就实现这套接口即可.      一般叫实现JDBC规范的jar包为JDBC驱动(我们通过JDBC接口执行数据库操作命令,具体让数据库操作的是驱动程序
发表于 2019-05-03 21:24:05 回复(0)
JDBC驱动提供了特定厂商对JDBC API接口类的实现,驱动必须要提供java.sql包下面这些类的实现:Connection,Statement,PreparedStatement,CallableStatement,ResultSet和Driver.
发表于 2016-04-19 22:25:53 回复(0)
jdbc 是一套Java访问数据库的接口规范,其他数据库厂商想要数据库能被通过Java代码调用需要做出相应的实现,在使用时需要将这些驱动加载到内存
发表于 2021-09-13 09:17:56 回复(0)
在使用jdbc前,应该保证相应的Driver类已经被加载到jvm中,并且完成了类的初始化工作就行了
发表于 2020-02-09 11:49:57 回复(0)
JDBC驱动提供了特定厂商对JDBC API接口类的实现,驱动必须要提供java.sql包下面这些类的实现:
Connection,Statement,PreparedStatement,CallableStatement,ResultSet和Driver

发表于 2019-04-28 20:38:10 回复(0)
JDBC驱动提供了特定厂商对JDBC API接口类的实现,驱动必须要提供java.sql包下面这些类的实现:Connection,Statement,PreparedStatement,CallableStatement,ResultSet和Driver。
发表于 2019-04-27 21:22:51 回复(0)
人类的本质。。。。。复读机
发表于 2019-03-18 18:58:30 回复(0)
jdbc驱动提供了产商对JDBC API接口的实现,必须实现Connector、Statement、PreparedStatement、CallableStatement、ResultSet和Driver
发表于 2019-03-04 01:27:33 回复(0)
jdbc驱动提供了特定厂商对jdbc api接口的实现
编辑于 2018-06-10 10:46:40 回复(0)
zll头像 zll
JDBC驱动提供了特定厂商对JDBC API接口类的实现,驱动必须要提供java.sql下的connection,Statement,PreparedStatement,CallableStatement,Result和Driver。
发表于 2016-03-21 16:00:40 回复(0)