加载MYSQL JDBC驱动问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了加载MYSQL JDBC驱动问题相关的知识,希望对你有一定的参考价值。
用java加载MYSQL JDBC驱动的时候,下面三种都能正常加载!请问他们有什么区别吗?
Class.forName("org.gjt.mm.mysql.Driver");
Class.forName("com.mysql.jdbc.Driver");
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
第二个是通过mysql驱动jar包加载JDBC驱动
第三个是odbc方式建立连接,没用到mysql驱动 参考技术B 三个都是加载数据库驱动,对于JDK来说,内部只是提供了一个数据库连接的规范,如Collection,Statement等都是一些接口,而如果你用MySQL,那么MySQL就会提供实现了这些接口的类,我们称之为数据库驱动,这三个通过Class.forName方式,会执行com.mysql.jdbc.Driver中的静态区域代码,从而注册到DriverManager中去,这才可以在后面使用DriverManager.getConnection()获取数据库连接。 参考技术C 首先Class.forName()是Java的反射方法,根据类名称获取类。你上面3行代码分别获取三个包的JdbcDriver类。用第二个,因为那个是官方的包。 参考技术D 用第二个,mysql官方提供的驱动包 第5个回答 2012-11-19 很明显 一个是apache的,一个是mysql官方的,一个是sun公司的
jdbc加载驱动方法
1.Class.forName("com.mysql.jdbc.Driver");
3.System.setProperty("jdbc.drivers", "com.mysql.jdbc.Driver");
DriverManager.registerDriver和 Class.forName()的异同
那么这两种方式有什么异同呢?首先我们到DriverManager中去看一下,
- public static synchronized void registerDriver(java.sql.Driver driver)
- throws SQLException {
- if (!initialized) {
- initialize();
- }
- DriverInfo di = new DriverInfo();
- di.driver = driver;
- di.driverClass = driver.getClass();
- di.driverClassName = di.driverClass.getName();
- // Not Required -- drivers.addElement(di);
- writeDrivers.addElement(di);
- println("registerDriver: " + di);
- /* update the read copy of drivers vector */
- readDrivers = (java.util.Vector) writeDrivers.clone();
- }
很明显,DriverManager将我们需要注册的驱动程序信息封装成DriverInfo放进了一个writeDrivers中,这个writeDrivers是DriverManager中声明的一个static类型Vector变量。在getConnection的时候会再用到。
那么Class.forName("com.mysql.jdbc.Driver")是如何注册驱动程序的呢,我们知道Class.forName("类名")的主要作用是向虚拟机实例化一个Class实例,我们看一下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!");
- }
- }
在 com.mysql.jdbc.Driver中有一段静态代码块,是向 DriverManager注册一个Driver实例。这样在Class.forName("com.mysql.jdbc.Driver")的时候,就会首先去执行这个静态代码块,于是和DriverManager.registerDriver(new Driver())有了相同的效果。
那么对于这两种方法,在这里,我推荐使用第二种,即Class.forName("类名")的方式。原因有两点
1、在我们执行DriverManager.registerDriver(new Driver())的时候,静态代码块也已经执行了,相当于是实例化了两个Driver对象。
2、 DriverManager.registerDriver(new Driver())产生了一种对MySQL的一种依赖。而Class.forName的方式我们完全可以在运行的时候再动态改变。
以上是关于加载MYSQL JDBC驱动问题的主要内容,如果未能解决你的问题,请参考以下文章
无法加载 JDBC 驱动程序类“com.mysql.jdbc.Driver”Tomcat 8 和 Eclipse
无法加载 JDBC 驱动程序类 [com.mysql.cj.jdbc.Driver]