JDBC 的原理 | 学习笔记

简介: 快速学习 JDBC 的原理

开发者学堂课程【JDBC数据库开发入门:JDBC 的原理】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/29/detail/629


JDBC 的原理


1、 JDBC 原理

早期 SUN 公司的天才们想编写一套可以连接天下所有数据库的 API,但是当他们刚刚开始时就发现这是不可完成的任务,因为各个厂商的数据库服务器差异太大了。

后来 SUN 开始与数据库厂商们讨论,最终得出的结论是,由 SUN 提供一套访问数据库的规范(就是一组接口),并提供连接数据库的协议标准,然后各个数据库厂商会遵循 SUN 的规范提供一套访问自己公司的数据库服务器的 API 出现。

SUN 提供的规范命名为 JDBC,而各个厂商提供的,遵循了 JDBC 规范的,可以访问自己数据库的 API 被称之为驱动。

图片20.png

其实 JDBC 就是一堆接口,那么谁来提供接口实现呢?

MySQL 要提供,Oracle 也要提供。这些数据库厂商会对这些接口提供实现类,这些实现类有什么用呢?

MySQL 提供的实现类可以用来访问 MySQL,Oracle 提供的实现类专门用来访问Oracle。

这样原先考虑的问题都先转嫁出去了,原先需要写很多语句,后来只需要提供一个接口,其他工作由数据库厂商自己来完成。应用程序需要使用 JDBC API,JDBC API 就是一种接口,这组接口需要实现类,实现类就称之为 JDBC 驱动驱动就是JDBC 的实现。

如何在JDBC代码里找到这个驱动呢,刚才说的就起到了决定性作用 Class.forName(“com.mysql.jdbc.Driver”);这个加载驱动类是 MySQL 提供的,若连接的是 Oracle 数据库,“com.mysql.jdbc.Driver”就需要改变了“jdbc:mysql://localhost:3306/mydb3”、“root”、”123“也需要改变。

图片21.png

连接不同数据库的区别就在于这四大参数,四大参数一改就可以连接另外一个数据库了,当然,需要配合驱动包来改。

导 jar 包:驱动

加载驱动类:class.forName(“类名”);

给出 url、username,其中 url 需要记住

使用 DriveManager 类来得到 Connection 对象

导 jar 包是必须的,提供一个驱动,来连接数据库。再者,必须自己加载驱动类,程序才能找到jar包。

接口 Driver

public interface Driver

每个驱动程序类必须实现的接口。

Java SQL 框架允许多个数据库驱动程序。

每个驱动程序都应该提供一个实现 Driver 接口的类。 DriverManager 会试着加载尽可能多的它可以找到的驱动程序,然后,对于任何给定连接请求,它会让每个驱动程序依次试着连接到目标 URL。 强烈建议每个 Driver 类应该是小型的并且是单独的,这样就可以在不必引入大量支持代码的情况下加载和查询 Driver 类

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

Class.forName("foo. bah.Driver")

1、驱动类 jar 包:

图片22.png

可以替换 Class.ForName("com.mysql.jdbc.Driver");//加载驱动类(注册驱动)为下面两句,效果是一样的

图片23.png

有了 Class.ForName("com.mysql.jdbc.Driver");//加载驱动类(注册驱动)程序内容自己就加载出来了,无需输入下面两句

图片24.png

2、Oracle类jar包

打开后找到静态代码

图片25.png

所有的 java.sql.Driver 实现类,都提供了 static 块,块内的代码就是把自己注册到 DriverManager 中!注册完就可以找到联系。

jdbc4.0之后,每个驱动 jar 包中,在 META-INF/services 目录下提供了一个名为java.sql.Driver 的文件, 文件的内容就是该接口的实现类名称!而4.0之前的版本是需要输入 Class.ForName("com.mysql.jdbc.Driver");//加载驱动类(注册驱动)

但是我们的代码应该兼容老版本的 jdbc,所以还是应该都输入Class.ForName("com.mysql.jdbc.Driver");//加载驱动类(注册驱动)


            </div>
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
JavaScript 前端开发
TypeScript 中的 infer 关键字
TypeScript 中的 infer 关键字
415 0
|
Cloud Native 关系型数据库 分布式数据库
阿里云牵手海亮科技,共建“教育科技数据库创新应用中心”
海亮科技选择引入阿里云PolarDB开源分布式版(PolarDB for Xscale)数据库,不仅能解决海亮科技数据库业务中面临的可靠性、稳定性问题,也为海亮科技业务的高速发展提供了更好的灵活性和可扩展性。
|
11月前
|
机器学习/深度学习 数据采集 自然语言处理
Pandas数据应用:情感分析
本文介绍了如何使用Pandas进行情感分析,涵盖数据准备、清洗、特征工程和模型构建。通过读取CSV文件、处理缺失值与重复项、转换文本格式,利用TF-IDF提取特征,并采用SVM等算法训练分类器。还讨论了内存不足、过拟合等问题的解决方案。旨在帮助读者掌握情感分析的基本流程与技巧。
288 35
|
存储 关系型数据库 MySQL
MySQL性能优化指南
【10月更文挑战第16天】MySQL性能优化指南
1104 0
|
JavaScript
Vue学习之--------Vue中自定义插件(2022/8/1)
这篇文章介绍了Vue中自定义插件的基本概念和实际应用,包括插件的定义、在`main.js`中使用`Vue.use()`引入插件,并通过代码实例展示了如何创建包含全局过滤器、指令和混入的插件,以及如何在Vue组件中使用这些自定义功能。同时,文章还解释了什么是mixin(混入)以及它的使用方式。
Vue学习之--------Vue中自定义插件(2022/8/1)
|
Rust 安全 JavaScript
Rust 和 WebAssembly 搞大事啦!代码在浏览器中运行,这波操作简直逆天!
【8月更文挑战第31天】《Rust 与 WebAssembly:将 Rust 代码运行在浏览器中》介绍了 Rust 和 WebAssembly 的强大结合。Rust 是一门安全高效的编程语言,而 WebAssembly 则是新兴的网页技术标准,两者结合使得 Rust 代码能在浏览器中运行,带来更高的性能和安全性。文章通过示例代码展示了如何将 Rust 函数编译为 WebAssembly 格式并在网页中调用,从而实现复杂高效的应用程序,同时确保了内存安全性和跨平台兼容性,为开发者提供了全新的可能性。
546 0
|
存储 JSON 关系型数据库
带你走进PostgreSQL的世界
带你走进PostgreSQL的世界
772 0
|
开发工具 Ubuntu Linux
vim中函数跳转的功能实现
该文介绍了如何在Vim中实现函数跳转功能,通过安装`ctags`插件来完成。在CentOS/OpenEuler使用`sudo yum install ctags`,Ubuntu系统用`sudo apt-get install ctags`安装ctags,然后在源代码目录下运行`ctags -R .`生成tags文件。在Vim中,使用`Ctrl + ]`跳转到定义处,`Ctrl + t`返回原位置。文章还提到跨文件跳转及`tags`文件的更新与配置Vim的相关信息。
387 2
如何使用mitmproxy 修改http code
如何使用mitmproxy 修改http code
|
数据采集 网络安全 数据中心
静态IP代理和动态IP代理的区别是什么?
在网络通信中,IP地址标识设备位置。静态IP代理提供固定的IP地址,确保稳定性与匿名性,适用于企业网络,而动态IP代理使用可变IP,提供灵活性,常用于爬虫和数据采集。静态IP代理稳定但易被识别封锁,动态IP代理灵活但可能暴露用户IP。两者主要区别在于IP地址是否固定。