• 【JDBC篇】Class.forName原理剖析


    本文以java连接mysql为例讲解;仅仅记录了一部分知识点,其余我还没学完,后面会补充!初学JDBC文章仅仅是我个人对知识点的理解,请谨慎参考!

    目录

    如何连接mysql数据库:

    为什么Class.forName可以注册驱动?


    如何连接mysql数据库

            我们在导入mysql-connector-java.jar包后,我们如何才能让自己的项目去连接mysql呢?

            首先在连接数据库之前我们需要下载jar包并导入,在jar中有java与mysql建立连接的方法,那就是jar包里面的com.mysql.jdbc.Driver类----驱动,我们怎么样才能在项目启动时调用jar包里的Driver以及其他方法呢?我们清楚在java中万事万物皆对象,所以我们想要调用Driver类及Driver类中的方法我们就需要创建一个Driver类对象,

    1. //1.数据库连接的4个基本要素:
    2. String url = "jdbc:mysql://localhost:3306/test"; String user = "root";
    3. String password = " ";
    4. String driverName = "com.mysql.jdbc.Driver";
    5. //2.实例化Driver
    6. Class clazz = Class.forName(driverName);
    7. Driver driver = (Driver) clazz.newInstance();
    8. //3.注册驱动
    9. DriverManager.registerDriver(driver);
    10. //4.获取连接
    11. Connection conn = DriverManager.getConnection(url, user, password);

            然而在项目中我们常通过反射技术Class.forName(“com.mysql.jdbc.Driver”),把Driver类加载进内存。来取代上面繁琐的创建对象过程,为什么可以这样呢?通过源码我们可以看到Driver里有个内置的静态代码块,在进入内存时会Driver类会初始化,静态代码块里的代码也会被执行。

    1. static {
    2. try {
    3. java.sql.DriverManager.registerDriver(new Driver()); // 注册驱动
    4. } catch (SQLException E) {
    5. throw new RuntimeException("Can't register driver!");
    6. }
    7. }

    为什么Class.forName可以注册驱动?

            这里说的注册驱动,指的是将java.sql.Driver实现类(对于连接mysql数据库来说,驱动就是mysql .com.mysql.cj.jdbc.Driver)注册到DriverManager.registeredDrivers 存储驱动信息的集合中。

            使用Class.forName("com.mysql.cj.jdbc.Driver")来注册驱动。仅看代码只是加载了这个类,并没有显示的注册驱动,那为什么还可以注册上去呢?打开com.mysql.cj.jdbc.Driver时,我们可以看到,静态代码块中会执行注册驱动的方法,而加载这个类时,静态代码块会被执行。所以Class.forName();可以注册驱动;

    1. public class Driver extends NonRegisteringDriver implements java.sql.Driver {
    2. // Register ourselves with the DriverManager
    3. static {
    4. try {
    5. java.sql.DriverManager.registerDriver(new Driver()); // 注册驱动
    6. } catch (SQLException E) {
    7. throw new RuntimeException("Can't register driver!");
    8. }
    9. }
    10. /**
    11. * Construct a new driver and register it with DriverManager
    12. *
    13. * @throws SQLException
    14. * if a database error occurs.
    15. */
    16. public Driver() throws SQLException {
    17. // Required for Class.forName().newInstance()
    18. }
    19. }

            通过以上代码我们可以看出Driver内置静态代码块中调用了java.sql.DriverManager的方法registerDriver(Driver driver)完成了注册驱动;

            最后通过驱动管理器DriverManager的getConnection方法去获取Connection与数据库建立连接

    1. //1.数据库连接的4个基本要素:
    2. String url = "jdbc:mysql://localhost:3306/test";
    3. String user = "root";
    4. String password = " ";
    5. String driverName = "com.mysql.jdbc.Driver";
    6. //2.加载驱动 (①实例化Driver ②注册驱动)
    7. Class.forName(driverName);
    8. //3.获取连接
    9. Connection conn = DriverManager.getConnection(url, user, password);

  • 相关阅读:
    Python常用命名规范,让你的代码更加优雅
    力扣-234.回文链表
    算法题系列10·最长公共前缀
    bootz启动 Linux内核过程中涉及的全局变量images
    算法----BF算法&KMP算法
    底层驱动day4作业
    梅科尔工作室-华为14天鸿蒙设备开发实战笔记六
    OpenResty介绍及实现限流
    2022年12月 C/C++(六级)真题解析#中国电子学会#全国青少年软件编程等级考试
    jmeter+ant+Jenkins集成
  • 原文地址:https://blog.csdn.net/m0_64231944/article/details/127758930