JDBC获取连接的5种方式

一.

com.mysql.jdbc.Driver是 MySQL 数据库的 JDBC 驱动类。

当使用 JDBC 来连接 MySQL 数据库时,需要在代码中明确指定该驱动类,以便建立与 MySQL 数据库的连接和进行相关操作。

import com.mysql.jdbc.Driver;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

public class way1 {
    public static void main(String[] args) {
        try {
            Driver driver=new com.mysql.jdbc.Driver();
            String url="jdbc:mysql://localhost:3306/study";
            Properties info=new Properties();
            info.setProperty("user","root");
            info.setProperty("password","java123");
            Connection connection=driver.connect(url,info);
            System.out.println(connection);
            connection.close();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }


    }
}

不足之处:new 了一个Driver,由于此处的Driver是第三方的,且是静态加载的,不够灵活

++不推荐使用++

TIP(静态加载)

在 Java 中,静态加载指的是在程序运行时根据类的全限定名(包名加类名)动态加载类并创建实例的过程。通过静态加载,可以在程序运行时根据需要动态加载类,而不是在编译时就确定需要加载的类。

静态加载通过 Java 的反射机制实现。在 Java 中,可以通过调用Class.forName()方法来加载指定的类。该方法接受一个字符串参数,表示需要加载的类的全限定名,返回一个Class对象。通过Class对象,就可以获取类的相关信息,如类的构造方法、成员变量、方法等。

二.

import com.mysql.jdbc.Driver;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

public class way2 {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, SQLException {
        //使用反射加载Driver类,动态加载,更加灵活,减少依赖性
        Class clazz =Class.forName("com.mysql.jdbc.Driver");
        Driver driver = (Driver) clazz.newInstance();
        String url="jdbc:mysql://localhost:3306/study";
        Properties info=new Properties();
        info.setProperty("user","root");
        info.setProperty("password","java123");
        Connection connection=driver.connect(url,info);
        System.out.println(connection);
        connection.close();
    }

}
使用反射加载Driver类,动态加载,更加灵活,减少依赖性

这是一种传统的手动加载和实例化数据库驱动的方式。

++不推荐使用++

三.

用DriverManager替换Driver

DriverManager`是 Java 中用于管理数据库驱动和建立数据库连接的类。 它主要有以下一些重要功能和特点: - 可以通过`DriverManager.getConnection()`方法来获取与数据库的连接,该方法通常需要传入数据库的连接字符串等参数。 - 负责加载和管理已注册的数据库驱动程序。 通过`DriverManager`,可以方便地实现与不同数据库的连接和交互操作。 

import com.mysql.jdbc.Driver;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

public class way3 {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, SQLException {
        //使用DriverManager 替代 Driver 进行统一管理
        Class clazz =Class.forName("com.mysql.jdbc.Driver");
        Driver driver = (Driver) clazz.newInstance();
        String url="jdbc:mysql://localhost:3306/study";
        String user="root";
        String password="java123";
        DriverManager.registerDriver(driver);//注册Driver驱动
        Connection connection=DriverManager.getConnection(url,user,password);
        System.out.println(connection);
        connection.close();
    }
    
}

registerDriver方法用于向DriverManager注册一个数据库驱动。

通过调用DriverManager.registerDriver(driver)(其中driver是具体的数据库驱动实例,如com.mysql.jdbc.Driver的实例),可以将该驱动告知DriverManager,以便后续在建立数据库连接等操作中使用。

需要注意的是,现在很多情况下并不需要显式调用这个方法来注册驱动了,因为在加载驱动类时通常会自动完成注册。

也不推荐 

四.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class way4 {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.jdbc.Driver");
        String url="jdbc:mysql://localhost:3306/study";
        String user="root";
        String password="java123";
        Connection connection= DriverManager.getConnection(url,user,password);
        System.out.println(connection);
    }
}
Class.forName("com.mysql.jdbc.Driver");

这行代码通过反射机制来加载指定的数据库驱动类(这里是 MySQL 的 JDBC 驱动类)。

当执行这行代码时,它会触发该驱动类的静态初始化块的执行,而通常在驱动类的静态初始化块中会完成向 DriverManager 注册该驱动的操作。所以实际上通过这种方式也实现了对驱动的注册,一般情况下就不再需要单独调用 DriverManager.registerDriver 了。这样做使得数据库连接的初始化过程更加简洁和自动化。

tip:与方法三对比,只是少了几行代码更加简洁,执行Class.forName("com.mysql.jdbc.Driver"); 时

在加载Driver类时,完成注册。

看Driver源码,发现里面有一个静态方法块,在类执行时会执行一次。完成注册

//Driver 源码
package com.mysql.jdbc;

import java.sql.DriverManager;
import java.sql.SQLException;

public class Driver extends NonRegisteringDriver implements java.sql.Driver {
    public Driver() throws SQLException {
    }

    static {
        try {
            DriverManager.registerDriver(new Driver());
        } catch (SQLException var1) {
            throw new RuntimeException("Can't register driver!");
        }
    }
}

++推荐使用++

四—2

当把通过反射机制加载Driver类的语句去除,数据库仍能连接

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class way5 {
    public static void main(String[] args) throws SQLException, ClassNotFoundException {
        //Class.forName("com.mysql.jdbc.Driver");    把这行注释掉
        String url="jdbc:mysql://localhost:3306/study";
        String user="root";
        String password="java123";
        Connection connection= DriverManager.getConnection(url,user,password);
        System.out.println(connection);
    }
}

原因: 

当前版本号5.1.7  版本符合 

 

在这个文件下会发现有一句代码,没当运行时会自动执行。帮助我们建立驱动 

但还是建议手写反射加载驱动

五.(对四的优化,增加配置文件,使连接更灵活)

增加一个配置文件,储存驱动连接的相关信息

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

public class way5 {
    public static void main(String[] args) throws SQLException, ClassNotFoundException, IOException {
        Properties properties=new Properties();
        properties.load(new FileInputStream("src/获取数据库连接的5种方式/mysql_information"));
        String user=properties.getProperty("user");
        String password=properties.getProperty("password");
        String driver = properties.getProperty("driver");
        String url = properties.getProperty("url");
        Class.forName(driver);
        Connection connection = DriverManager.getConnection(url, user, password);
        System.out.println(connection);

    }
}

 TIP:主体还是第四种连接方式,只是增加了一个配置文件,并用Properties读取,使得加载驱动更加灵活。——————

OVER!

猜你喜欢

转载自blog.csdn.net/2303_80480614/article/details/139484664