JDBC之驱动加载原理全面解析

本文深入解析JDBC驱动加载原理,介绍了JDBC的概念、设计目的及组成。讲解了DriverManager如何加载和管理驱动,包括如何获取指定Driver、注册和取消注册驱动,以及创建Connection连接对象的过程。此外,还提到了jdbc.drivers系统属性在驱动加载中的作用。
摘要由CSDN通过智能技术生成

JDBC概念

Java DataBase Connectivity(Java数据库连接技术)
它是将Java与SQL结合且独立于特定的数据库系统的应用程序编程接口(API-它是一种可用于执行SQL语句的JavaAPI,即由一组用Java语言编写的类与接口所组成)

JDBC设计的目的

它是一种规范,设计出来的主要目的是为了让各个数据库开发商为Java程序员提供标准的数据访问类和接口,使得独立于DBMS的Java应用程序的开发成为可能(数据库改变,驱动程序跟着改变,但是应用程序不变)
Java设计规范接口,各大数据库产商遵守规范实现,Java程序员不需要考虑实现细节,只需要调用API即可
在这里插入图片描述

JDBC组成

JDBC API (统一的应用接口)
JDBC Driver Manager(驱动程序管理器)
JDBC 数据库驱动程序 驱动本质就是一个Java类,这个类实现了JavaAPI定义的接口
一般情况下,在应用程序中进行数据库连接,调用JDBC接口,首先要将特定厂商的JDBC驱动实现加载到系统内存中,然后供系统使用
在这里插入图片描述
这里所谓的驱动,其实就是实现了java.sql.Driver接口的类。如oracle的驱动类是 oracle.jdbc.driver.OracleDriver.class(此类可以在oracle提供的JDBC jar包中找到),此类实现了java.sql.Driver接口。
由于驱动本质上还是一个class,将驱动加载到内存和加载普通的class原理是一样的,使用Class.forName("driverName")。以下是将常用的数据库驱动加载到内存中的代码:

	//加载Oracle数据库驱动
	Class.forName("oracle.jdbc.driver.OracleDriver");
			
	//加载SQL Server数据库驱动
	Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
			
	//加载MySQL 数据库驱动
	Class.forName("com.mysql.jdbc.Driver");
	//静态代码块,加载时优先加载静态代码块中的代码
	static {
   
		Timestamp localTimestamp = Timestamp.valueOf("2000-01-01 00:00:00.0");
		try {
   
			if (defaultDriver == null) {
   
				//创建一个OracleDriver实例,然后注册到DriverManager中
                Driver defaultDriver = new OracleDriver();
				DriverManager.registerDriver(defaultDriver);
			}
 
		} catch (RuntimeException localRuntimeException) {
   
			//省略异常代码
		} catch (SQLException localSQLException) {
   
			//省略异常代码
	}

Driver接口
public interface Driver
每个驱动程序类必须实现的接口。
Java SQL 框架允许多个数据库驱动程序。
每个驱动程序都应该提供一个实现 Driver 接口的类。

DriverManager 会试着加载尽可能多的它可以找到的驱动程序,然后,对于任何给定连接请求,它会让每个驱动程序依次试着连接到目标 URL。

强烈建议每个 Driver 类应该是小型的并且是单独的,这样就可以在不必引入大量支持代码的情况下加载和查询 Driver 类。

在加载某一 Driver 类时,它应该创建自己的实例并向 DriverManager 注册该实例。这意味着用户可以通过调用以下程序加载和注册一个驱动程序
Class.forName("foo.bah.Driver")

在这里插入图片描述
acceptsURL(String url) 方法用来测试对指定的url,该驱动能否打开这个url连接。driver对自己能够连接的url会制定自己的协议,只有符合自己的协议形式的url才认为自己能够打开这个url,如果能够打开,返回true,反之,返回false;
注意:这里acceptsURL(url)只会校验url是否符合协议,不会尝试连接判断url是否有效

例如:oracle定义的自己的url协议如下:

jdbc:oracle:thin:@//<host>:<port>/ServiceName
jdbc:oracle:thin:@<host>:<port>:<SID>

connect(String url,Properties info)方法,创建Connection对象,用来和数据库的数据操作和交互,而Connection则是真正数据库操作的开始(在此方法中,没有规定是否要进行acceptsURL()进行校验)。

手动加载驱动 Driver 并实例化进行数据库操作的例子

public static void driverTest(){
   
		try 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值