首页 > 数据库 >JDBC加载MySQL驱动【底层实现】

JDBC加载MySQL驱动【底层实现】

时间:2024-08-12 14:39:18浏览次数:13  
标签:driversIterator JDBC java MySQL mysql ServiceLoader 加载

JDBC4.0如何加载

  1. 引入依赖

      <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <version>8.0.32</version>
      </dependency>
    
  2. 上代码

     import java.sql.Connection;
     import java.sql.DriverManager;
     import java.sql.SQLException;
    
     public class DatabaseUtil {
         public static Connection getConnection() throws SQLException {
             // 驱动会自动注册,无需手动加载
             String url = "jdbc:mysql://localhost:3306/mydb";
             String user = "user";
             String password = "password";
             return DriverManager.getConnection(url, user, password);
         }
     }
    

在这个过程中,如何加载到mysql-connector-java的呢?

进入DriverManager类中会发现如下内容:

走到loadInitialDrivers()方法中看:

会发现他去加载了Driver.class,而这个类是rt.jar里的一个接口

从上面的run()方法中,不难看出利用了ServiceLoader.load(),去加载了他的实现类

  ServiceLoader<Driver> loadedDrivers = ServiceLoader.load(Driver.class);
  Iterator<Driver> driversIterator = loadedDrivers.iterator();
  try{
      while(driversIterator.hasNext()) {
          driversIterator.next();
      }
  } catch(Throwable t) {
  // Do nothing
  }

再看下ServiceLoader类中:

通过Iterator<Driver> driversIterator = loadedDrivers.iterator();

  while(driversIterator.hasNext()) {
      driversIterator.next();
  }

去迭代获取加载Driver,而,我们的MySQL驱动就在其中:

通过以上步骤,就可以明白 com.mysql:mysql-connector-j:8.0.32中的驱动是如何加载的了

标签:driversIterator,JDBC,java,MySQL,mysql,ServiceLoader,加载
From: https://www.cnblogs.com/dragon-925/p/18354884

相关文章

  • 基于SpringBoot+MySQL+SSM+Vue.js的物业管理系统(附论文)
    获取见最下方名片信息获取见最下方名片信息获取见最下方名片信息演示视频基于SpringBoot+MySQL+SSM+Vue.js的物业管理系统(附论文)技术描述开发工具:Idea/Eclipse数据库:MySQLJar包仓库:Maven前端框架:Vue/ElementUI后端框架:Spring+SpringMVC+Mybatis+Sprin......
  • 基于SpringBoot+MySQL+SSM+Vue.js的大学生兼职系统(附论文)
    获取见最下方名片信息获取见最下方名片信息获取见最下方名片信息演示视频基于SpringBoot+MySQL+SSM+Vue.js的大学生兼职系统(附论文)技术描述开发工具:Idea/Eclipse数据库:MySQLJar包仓库:Maven前端框架:Vue/ElementUI后端框架:Spring+SpringMVC+Mybatis+Spr......
  • 基于SpringBoot+MySQL+SSM+Vue.js的线上教育培训办公系统(附论文)
    获取见最下方名片信息获取见最下方名片信息获取见最下方名片信息演示视频基于SpringBoot+MySQL+SSM+Vue.js的线上教育培训办公系统(附论文)技术描述开发工具:Idea/Eclipse数据库:MySQLJar包仓库:Maven前端框架:Vue/ElementUI后端框架:Spring+SpringMVC+Mybat......
  • mysql 计算两个日期的时间差(年龄)
    TIMESTAMPDIFF(时间粒度,开始时间,结束时间)1、时间粒度:秒:SECOND分:MINUTE时:HOUR天:DAY周:WEEK季度:QUARTER月:MONTH年:YEAR2、计算相差的时间粒度数,实例:秒数:SELECTTIMESTAMPDIFF(SECOND,'2000-06-1500:00:00',DATE_FORMAT(NOW(),'%Y-%m-%d%H:%i:%S'))小时数SELE......
  • 通过Shell脚本创建指定ip上的MySQL非系统库的所有表的表结构
    dbaloginSource='/data/dba/mysql8/bin/mysql-uroot_dba-ppassword-hxxx'dbaloginTarget='mysql-h127.0.0.1-P3340-uroot-proot'#showdatabases过滤出数据库名dbs=`$dbaloginSource-e"showdatabases\G"2>/dev/null|grep......
  • MySQL——删除数据(二)DELETE 删除全部数据
            在DELETE语句中如果没有使用WHERE子句,则会将表中的所有记录都删除。        例如,删除student表中的所有记录,在删除数据之前首先使用查询语句查看student表中的所有记录,执行结果如下所示:mysql>select*fromstudent;+------+---------+---......
  • MySQL——删除数据(一)DELETE 删除部分数据
            删除数据是指对表中存在的记录进行删除,这是数据库的常见操作,比如一个学生转学了,就需要在student表中将其信息记录删除。MySQL中使用DELETE语句来删除表中的记录,其语法格式如下所示:DELETEFROM表名[WHERE条件表达式]    在上面的语法格式中,......
  • 【MYSQL】表的设计
    目录数据库约束notnull约束unique(唯一)约束default默认值约束primarykey(主键)约束foreignkey(外键)约束check约束总结表的设计三大范式第一范式第二范式第三范式表的关系数据库约束是关系型数据库的一个重要功能,主要作用是保证数据的完整性,也可能理解数据......
  • Golang中使用redis,mysql
    一、redis简介redis(REmoteDIctionaryServer)是一个由SalvatoreSanfilippo写key-value存储系统,它由C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value类型的数据库,并提供多种语言的API。和Memcached类似,它支持存储的value类型相对更多,包括string(......
  • MySQL授权用户对存储过程查询和执行权限【转】
    1、授权MySQL存储过程执行权限在项目中往往会用到存储过程来统计一些比较复杂的报表,如果数据库是mysql,则需要在执行存储过程前需要为用户添加权限,才可以,否则会提示:mysqlUserdoesnothaveaccesstometadatarequiredtodeterminestoredprocedureparametertypes错误。......