java连接数据库时加载驱动程序Class.forName(driveName)详解

lianglin999 2011-04-24 11:26:44
小弟刚刚转向java,在连接数据库的时候,以前都是死记整个连接过程的,并不知道各个语句真正的作用,今天闲来无事,看了看源代码,将个人理解列出,希望各位指出不足和错误之处。

连接数据库,一般都是这样一个过程:

package lin.test;
import java.sql.*;

public class Test
{
public static void main(String[] args)
{
//驱动程序名
String driveName = "com.mysql.jdbc.Driver";
//URL指向要访问的数据库名test
String databaseURL = "jdbc:mysql://localhost:3306/test";
//MySQL配置时的用户名
String user = "root";
//MySQL配置时的密码
String password = "root";// 此处写自己的密码
try
{
//加载驱动
Class.forName(driveName);
System.out.println("成功加载数据库驱动程序");
}

catch (java.lang.ClassNotFoundException e)
{
System.out.println("加载数据库驱动程序失败");
System.out.println("加载数据库驱动程序失败");
System.out.println(e.getMessage());
return;
}
try
{
/连续MySQL数据库
Connection con = DriverManager.getConnection(databaseURL, user,password);
System.out.println("连接数据库成功");
//关闭连接
con.close();
}
catch (SQLException e)
{
System.out.println("连接数据库失败");
System.out.println("SQLException:" + e.getMessage());
return;
}
}
}


代码中Class.forName(driveName);一直困扰我,书上的解释就是它就是加载驱动程序的,那么,它究竟是怎么加载的呢?
首先,我们来看看Class.forName()方法究竟是干什么的?
JDK API 中的解释是这样的:
public static Class<?> forName(String className)
throws ClassNotFoundException
返回与带有给定字符串名的类或接口相关联的 Class 对象。调用此方法等效于:
Class.forName(className, true, currentLoader)
其中 currentLoader 表示当前类的定义类加载器。
例如,以下代码片段返回命名为 java.lang.Thread 的类的运行时 Class 描述符。
Class t = Class.forName("java.lang.Thread")
调用 forName("X") 将导致命名为 X 的类被初始化。
参数:
className- 所需类的完全限定名。
返回:
具有指定名的类的 Class 对象。
抛出:
LinkageError- 如果链接失败
ExceptionInInitializerError- 如果此方法所激发的初始化失败
ClassNotFoundException- 如果无法定位该类

所以Class.forName(driveName);即Class.for("com.mysql.jdbc.Driver"),它返回了一个Driver对象。
那么,这句代码的意思就是返回一个Driver对象,跟加载驱动程序有什么关系呢?(小弟当时也纳闷啊)。
后来翻看了一下Driver类的源代码,才恍然大悟:
Driver类的源代码如下:
/ * When a Driver class is loaded, it should create an instance of itself and register it with the DriverManager. This means that a user can load and register a driver by doing Class.forName("foo.bah.Driver")
*/
package com.mysql.jdbc;
import java.sql.SQLException;

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()
}
}


在返回Driver类对象的时候,首先执行的是static静态代码快里的内容,通过执行
java.sql.DriverManager.registerDriver(new Driver());
来注册驱动程序的。
我们再来看看JDK API中对registerDriver方法的解释
public static void registerDriver(Driver driver)
throws SQLException
向 DriverManager 注册给定驱动程序。新加载的驱动程序类应该调用 registerDriver 方法让 DriverManager 知道自己。
参数:
driver- 将向 DriverManager 注册的新的 JDBC Driver
抛出:SQLException- 如果发生数据库访问错误

新加载的驱动程序类应该调用 registerDriver 方法让 DriverManager 知道自己。 这一句是不是就让Driver类中的
java.sql.DriverManager.registerDriver(new Driver());
理所当然了呢。

好了,注册完驱动程序之后,我们就可以通过调用DriverManager的其他方法进行数据库的操作了.
以上就是小弟的个人理解了,请批评指正。
...全文
1989 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
woshikalz9 2012-08-16
  • 打赏
  • 举报
回复
lz有个地方好像不是很正确,Class.forName(driveName);返回的不是Driver对象,返回的是Driver所属的类类型对象啊。
BUG胡汉三 2011-04-26
  • 打赏
  • 举报
回复
Class.forName(driveName);

反射、反射~~~!!!
haiyex1 2011-04-26
  • 打赏
  • 举报
回复
哈哈 正在找java连接数据库的东西 多谢
liuke100 2011-04-24
  • 打赏
  • 举报
回复
不错,对新手来说还是很有帮助的,攒一个
  • 打赏
  • 举报
回复

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧