JDBC加载Driver
程序员文章站
2022-07-07 21:32:32
...
转载:http://blog.csdn.net/ronux/article/details/8186488
在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://*.com/questions/12933113/better-understaning-class-fornamecom-mysql-jdbc-driver-newinstance?rq=1