JDBC4.0加载Driver

本文探讨了在Java中使用JDBC4.0进行数据库连接时的新方法,不再需要通过`Class.forName()`注册Driver。在JDBC4.0中,只要将数据库提供商的JDBC jar包加入classpath,无需明确指定Driver类,系统会自动通过Service Provider机制找到合适的Driver。然而,这要求Driver jar包包含`META-INF/services/java.sql.Driver`文件来指示Driver类。在此之前,常见的注册驱动方式包括`Class.forName()`和`newInstance()`,但现在这些已不再是必要步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在java中创建JDBC数据库连接,分为简单的四步:

1. 在代码中引入JDBC使用到的类,import java.sql.*;;

2. 注册JDBC驱动:由JVM加载相应的驱动类到内存中;

3. 组织URL信息;

4. DriverManger.getConnnection()创建连接。

不过在注册驱动时,有几种不同的做法:1).Class.forName("com.mysql.jdbc.Driver");2).Class.forName("com.mysql.jdbc.Driver").newInstance();3).DriverManager.registerDriver(new com.mysql.jdbc.Driver())。

在Java中,一个类只有在需要的时候才会被加载的,而JDBC的代码通常不会直接引用Driver的,所以只能在代码中通过上述三种方式主动加载。我一直很想知道前两种注册驱动的区别,其实是这样的,每一个数据库提供商实现的Driver都有一个static代码块,也就是在按照第一种方式加载某Driver时已经完成了必要的初始化操作。也就是说可以不再按第二种方式的.newInstance()也是可以的。但是现实中的程序多是用第二种方式,tutorialspoint中解释说这样做是为了让程序在一些不兼容的JVM中也能正常工作。

com.mysql.jdbc.Driver的static代码块:

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

加载和初始化Driver的工作完成了,但是在创建数据库连接时,DriverManager并不知道我们需要的是哪一个驱动,因为JVM可能加载了不止mysql的一个驱动。在实现中,DriverManager通过遍历drivers数组(在内部为Vector类型),并分别调用每一个driver(已经被加载的)的acceptsURL(url),询问他们是否能处理这样的url,以此完成选择Driver的工作。

不过JDBC4.0推出已有些年头了,根据Java SE Service Provider机制Class.forName("com.mysql.jdbc.Driver")不再是必要的,并且对于已经这样做的旧代码,也可以不修改一行代码仍旧适用。新规范里,只要数据库提供商的JDBC jar包添加到classpath,而开发人员根本不需要知道需要的是哪一个Driver,并且做到了程序代码和Driver的名称完全无关。不过要这样做是有前提的,数据库提供商的JDBC jar包必须支持这样的新机制。具体而言就是,JDBC4.0 Driver jar包中必须包含META-INF/services/java.sql.Driver文件,这个文件里包含了提供商实现的新Driver类的全路径。

参考资料:

http://www.tutorialspoint.com/jdbc/jdbc-db-connections.htm

http://stackoverflow.com/questions/12933113/better-understaning-class-fornamecom-mysql-jdbc-driver-newinstance?rq=1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值