博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
对JDBC驱动注册--DriverManager.registerDriver和 Class.forName()的理解
阅读量:3950 次
发布时间:2019-05-24

本文共 3090 字,大约阅读时间需要 10 分钟。

JDBC提供了独立于数据库的统一API,MySQL、Oracle等数据库公司都可以基于这个标准接口来进行开发。包括java.sql包下的Driver,Connection,Statement,ResultSet是JDBC提供的接口。而DriverManager是用于管理JDBC驱动的服务类,主要用于获取Connection对象(此类中全是静态方法)。

当我们查看API,在Driver接口中,明确要求:Driver接口是每个驱动程序类必须实现的接口。Java SQL 框架允许多个数据库驱动程序。每个驱动程序都应该提供一个实现 Driver 接口的类。并且明确:在加载某一 Driver 类时,它应该创建自己的实例并向 DriverManager 注册该实例。这意味着用户可以通过调用以下程序加载和注册一个驱动程序

Class.forName(“foo.bah.Driver”)

下边重点分析注册驱动的两种方式:

第一种:

Driver driver = new Driver();//com.mysql.jdbc.Driver    DriverManager.registerDriver(driver);

第二种:

Class.forName("com.mysql.jdbc.Driver");

这两种注册方式有什么不同呢?第一种方式,相对比较好理解,就是先创建数据库驱动,然后调用registerDriver()方法完成注册。第二种方法是利用发射机制来完成的,直接看的话, 我们会想 Class.forName(driverClass) 只能帮助我们得到Driver的Class对象啊,为什么会帮我们完成注册了呢。从上边对Driver()的API的查阅,API要求:在加载某一 Driver 类时,它应该创建自己的实例并向 DriverManager 注册该实例。我们猜想是在类加载时,就自动完成了注册。下边去具体看一下源码:

第一种方法,其JDK1.7下的DriverManger的registerDriver()方法:

public static synchronized void registerDriver(java.sql.Driver driver)        throws SQLException {
/* Register the driver if it has not already been added to our list */ if(driver != null) {
registeredDrivers.addIfAbsent(new DriverInfo(driver)); } else {
// This is for compatibility with the original DriverManager throw new NullPointerException(); } println("registerDriver: " + driver); } 从其源码,可以看到DriverManger将要注册的驱动程序信息封装到了DriverInfo中,然后放进了一个List中。在后边获得连接时会再用到。 // List of registered JDBC drivers private final static CopyOnWriteArrayList
registeredDrivers = new CopyOnWriteArrayList
();

第二种方法:第二种方法是怎么通过只要获得Driver的Class对象就可以完成注册呢,下边看一下其com.mysql.jdbc.Driver的源码:

public class Driver extends NonRegisteringDriver implements java.sql.Driver {
// ~ Static fields/initializers // --------------------------------------------- // // Register ourselves with the DriverManager // static {
try {
java.sql.DriverManager.registerDriver(new Driver()); } catch (SQLException E) {
throw new RuntimeException("Can't register driver!"); } } 从上边可以看到,它是用静态代码块实现的。根据类加载机制,当执行 Class.forName(driverClass) 获取其Class对象时, com.mysql.jdbc.Driver 就会被JVM加载,连接,并进行初始化,初始化就会执行静态代码块,也就会执行下边这句代码:java.sql.DriverManager.registerDriver(new Driver());

这就和第一种方式相同了。

对于上边的两种驱动注册方法,我们一般采用第二种方法:

(1)第一种方式 Driver driver = new Driver() 其在内部也执行静态代码块,这相当于实例化了两个Driver对象;

(2)第一种方式 Driver driver = new Driver() 会产生对某一种数据库的依赖(会import驱动包),耦合性较高。

所以一般采用低二种方式。

JDBC连接数据库的步骤为:       // 首先要导入数据库驱动jar包、直接复制到文件那里,然后加入到路径	// 1. 注册驱动	Class.forName("com.mysql.jdbc.Driver");java反射机制	//2. 创建一个连接对象	Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb","root","password");	//3. 创建一个sql语句的发送命令对象	Statement stmt = conn.createStatement();	// 4. 执行sql,拿到查询的结果集对象	ResultSet rs = stmt.executeQuery("select * from stu");	//5. 输出结果集的数据	while(rs.next()){
system.out.println(rs.getInt("id")+":"+rs.getString("name")); } //6. 关闭连接,命令对象以及结果集。 rs.close(); stmt.close(); conn.close();

转载地址:http://hnuzi.baihongyu.com/

你可能感兴趣的文章
大数据读心术丨这15条数据统计准爆了!
查看>>
500款各领域机器学习数据集,总有一个是你要找的
查看>>
收藏 | Linux常用156个命令汇总!
查看>>
十张图看懂未来大数据世界
查看>>
“揭秘”大数据的10个神话!
查看>>
《中国区块链行业发展报告2018》全文发布!
查看>>
高盛发布区块链报告:从理论到实践(中文版)
查看>>
用Python从零开始创建区块链
查看>>
使用 Charles 抓取 app 数据包
查看>>
Linux time subsystem 详解(1) ----概述
查看>>
大牛很通俗地介绍《信号与系统》
查看>>
执行程序(例如UltraEdit)在WIN7下添加到右键菜单
查看>>
flash and root your Nexus10
查看>>
深入学习Make命令和Makefile(上)(2)
查看>>
深入学习Make命令和Makefile(下)(2)
查看>>
10大玄机为你揭开炒土豆丝爽脆的秘密——尖椒土豆丝
查看>>
grep与正则表达式
查看>>
git patch 使用
查看>>
如何进行Linux Kernel 开发
查看>>
技术人攻略访谈二十九:平行世界守护者
查看>>