Java数据库连接class.forName()的原因

Java数据库连接class.forName()的原因

说明Java中的数据库驱动程序:
数据库的驱动程序是指实现java数据库连接接口的相关类。Java提供数据库连接的相关标准(各种接口类),然后比如mysql,orical来实现Java连接数据库的标准,这些实现类就是Java中数据库的驱动程序。

要明白为什么要写class.forName(驱动名)的原因首先要知道class.forName()有什么作用。

这涉及到了反射强制加载类的过程: Java中 类的加载概述和加载时机

过程有下面几个:
加载、验证、准备、解析、初始化。其中在初始化阶段会初始化静态成员变量,以及运行静态代码块。

而Class.forName();能够起到运行静态初始化语句(静态初始化语句就是静态代码块,在《深入理解java虚拟机》里面都说的是静态初始化语句)的作用。

反观Class.forName(“com.mysql.jdbc.Driver”);

下面是com.mysql.jdbc.Driver这个类的源码

public class Driver extends NonRegisteringDriver implements java.sql.Driver {
    // ~ Static fields/initializers
    // ---------------------------------------------

    //
    // Register ourselves with the DriverManager
    //
    static {
        try {
            java.sql.DriverManager.registerDriver(new Driver());//这个就是注册驱动的关键代码,它位于静态代码块中。
        } catch (SQLException E) {
            throw new RuntimeException("Can't register driver!");
        }
    }

    // ~ Constructors
    // -----------------------------------------------------------

    /**
     * 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()看看这个类是干什么的(图片看不清可以打开图片链接查看):

这里写图片描述

调用registerDriver方法就能让DriverManager(驱动类管理)知道它的实现类是什么。因为传了个参数进去。比如这里传的是MySQL的Driver对象进去。而这个参数对象继承了NonRegisteringDriver这个类,而这个类实现了相关的数据库连接的方法。所以,java.sql.DriverManager能够获取相关的connect数据库连接。

也就是说,通过这个代码获取Connection对象:

public static Connection getMySQLConnection(String userName,String passWord,String dataBaseName) throws SQLException, ClassNotFoundException{

        Class.forName("com.mysql.jdbc.Driver");

        String url="jdbc:mysql://119.29.207.188:3306/"+dataBaseName;
        return DriverManager.getConnection(url, userName, passWord);
    }

然后这样写也是对的。这样获取Connection对象是一样的。

public static Connection getMySQLConnection(String userName,String passWord,String dataBaseName) throws SQLException, ClassNotFoundException{

        com.mysql.jdbc.Driver driver=new com.mysql.jdbc.Driver();
        java.sql.DriverManager.registerDriver(driver);

        String url="jdbc:mysql://119.29.207.188:3306/"+dataBaseName;
        return DriverManager.getConnection(url, userName, passWord);
    }

但是到了jdbc4.0以后就算不写这个代码Class.forName(“com.mysql.jdbc.Driver”);
当导入相关数据库连接包之后也能够正确连接到数据库。那么这是为什么呢?

public static Connection getMySQLConnection(String userName,String passWord,String dataBaseName) throws SQLException, ClassNotFoundException{

        String url="jdbc:mysql://119.29.207.188:3306/"+dataBaseName;
        return DriverManager.getConnection(url, userName, passWord);
    }

因为在jdbc4.0以后jdbc会自动读取导入的数据库实现包中META-INF\services下的java.sql.Driver文件里面的内容。

这里写图片描述

这里写图片描述

里面是com.mysql.jdbc.Driver这个类名,那么这样就能够通过反射中的方法,通过类名来加载这个类了。这里的类名是写完整路径,即包名+类名。

所以当我们就算不写Class.forName(“com.mysql.jdbc.Driver”);这个反射代码来加载com.mysql.jdbc.Driver类也是能够正确运行的。但是在jdbc4.0以前是不能够正确运行的,所以为了让我们的代码向下兼容,我们还是得把Class.forName(…)加上为好。

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值