一.
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!