JDBC4.0以后(mysql-connector-java 5.1.6之后) + java6以后,不再需要显示调用Class.forName()加载驱动了。
JDBC 4.0的特性
得益于Mustang中的Java SE 服务提供商机制,Java开发人员再也不必用类似Class.forName() 的代码注册JDBC驱动来明确加载JDBC。当调用DriverManager.getConnection()方法时,DriverManager类将 自动设置合适的驱动程序。该特性向后兼容,因此无需对现有的JDBC代码作任何改动。
就可以直接这样写:
String url = "jdbc:mysql://localhost:3306/test";
Connection conn = DriverManager.getConnection(url,username,password);
由于JDBC 4.0之前并没有采用SPI机制也没有用static代码块讲自己注册到驱动管理器的驱动列表中,另外配套的Java版本好像也比较低(是为了适配jdk5),对应的驱动管理器代码和现在也不一样。因此需要手动调用Class.forName来加载class文件到jvm并初始化。
代码如下
package lin.test;
import java.sql.*;
public class Test
{
public static void main(String[] args)
{
//驱动程序名
String driveName = "com.mysql.jdbc.Driver";
//URL指向要访问的数据库名test
String databaseURL = "jdbc:mysql://localhost:3306/test";
//MySQL配置时的用户名
String user = "root";
//MySQL配置时的密码
String password = "root";// 此处写自己的密码
try
{
//加载驱动:利用反射机制 构建了mysql的驱动程序
// com.mysql.jdbc.Driver 定位到 Driver类型
// 执行 Driver 中的 static方法块
// 向DriverManager 注册 这样
// DriverManager.getConnection才有用
// 通过注册驱动的形式告诉APP使用的是什么数据库
Class.forName(driveName);
System.out.println("成功加载数据库驱动程序");
}
catch (java.lang.ClassNotFoundException e)
{
System.out.println("加载数据库驱动程序失败");
System.out.println("加载数据库驱动程序失败");
System.out.println(e.getMessage());
return;
}
try
{
//连续MySQL数据库
Connection connection= DriverManager.getConnection(databaseURL, user,password);
//3,连接上数据库后,我就可以操作数据库中的表了。
Statement statement = connection.createStatement();
//4,操作完表后,将返回的结果进行处理
ResultSet resultSet = statement.executeQuery("select * from users");
System.out.println("连接数据库成功");
//关闭连接
resultSet.close();
statement.close();
connection.close();
}
catch (SQLException e)
{
System.out.println("连接数据库失败");
System.out.println("SQLException:" + e.getMessage());
return;
}
}
}
Class.forName(driveName); 返回Driver类型对象,同时执行驱动的类静态代码块中,调用DriverManager的注册驱动方法new一个自己当参数传给驱动管理器。所以 直接用Class.forName(driveName);
Class.forName():将类的.class文件加载到jvm中 之外,还会对类进行解释,执行类中的static代码块。
package com.mysql.cj.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!");
}
}
}