首页 > 编程学习 > 【JDBC篇】Class.forName原理剖析

【JDBC篇】Class.forName原理剖析

发布时间:2022/11/9 9:34:26

本文以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.数据库连接的4个基本要素:
String url = "jdbc:mysql://localhost:3306/test"; String user = "root";
String password = "   ";
String driverName = "com.mysql.jdbc.Driver";
//2.实例化Driver
Class clazz = Class.forName(driverName);
Driver driver = (Driver) clazz.newInstance();
//3.注册驱动
DriverManager.registerDriver(driver);
//4.获取连接
Connection conn = DriverManager.getConnection(url, user, password);

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

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

为什么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();可以注册驱动;

public class Driver extends NonRegisteringDriver implements java.sql.Driver {
    // Register ourselves with the DriverManager
    static {
        try {
            java.sql.DriverManager.registerDriver(new Driver()); // 注册驱动
        } catch (SQLException E) {
            throw new RuntimeException("Can't register driver!");
        }
    }
    /**
     * Construct a new driver and register it with DriverManager
     * 
     * @throws SQLException
     *             if a database error occurs.
     */
    public Driver() throws SQLException {
        // Required for Class.forName().newInstance()
    }
}

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

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

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

Copyright © 2010-2022 dgrt.cn 版权所有 |关于我们| 联系方式