目录

如何连接mysql数据库:

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


如何连接mysql数据库:

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

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()
    }
}

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);