java 数据库连接驱动为什么使用Class.forName()?

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!");
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值