说明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(…)加上为好。