DriverManager.registerDriver和 Class.forName()的异同
来源:互联网 发布:国内java大牛的博客 编辑:程序博客网 时间:2024/05/19 17:58
在学习JDBC的时候,通常有两种方式去注册数据库驱动程序(这里采用MySQL数据库),分别为:
- DriverManager.registerDriver(new Driver());
- Class.forName("com.mysql.jdbc.Driver");
那么这两种方式有什么异同呢?首先我们到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的方式我们完全可以在运行的时候再动态改变。
- DriverManager.registerDriver和 Class.forName()的异同
- DriverManager.registerDriver和 Class.forName()的异同
- DriverManager.registerDriver和 Class.forName()的异同
- DriverManager.registerDriver和 Class.forName()的异同
- DriverManager.registerDriver和 Class.forName()的异同
- MySQL JDBC驱动 - Class.forName和java.sql.DriverManager.registerDriver(new Driver())的区别
- 对JDBC驱动注册--DriverManager.registerDriver和 Class.forName()的理解
- Class.forName vs DriverManager.registerDriver -> Load JDBC Driver
- DriverManager.getConnection Class.forName 详解
- Class.forName与DriverManager区别
- System.setProperty和Class.forName方法获取数据库连接的异同
- 为什么使用DriverManager之前要Class.forName?
- DriverManager.registerDriver(new Driver())不能执行的原因
- JDBC的Class.forname()和Class.forname().newInstance的区别
- Class.forName 和 .class
- struct 和 class的异同?
- class和struct 的异同
- struct和class的异同
- 顺序队列
- 黑马程序员-集合
- 基于iframe的图片无刷新上传和用ajax生成缩略图和即时删除,封装于thinkphp
- z-stack代码分析--osalInitTasks函数
- SQL Server Database Mirroring - Creating and using Mirror Endpoints in Principal, Mirror and Witness
- DriverManager.registerDriver和 Class.forName()的异同
- 几本经典的云计算方面的书籍下载-电子书下载
- Function overloading and const keyword
- 多态是如何实现的
- DP问题初步(杭电1003)
- Customizing and Extending the SharePoint 2010 Server Ribbon
- C#GDI+简单绘图
- 分享一款: 方便快捷的远程桌面管理软件
- 今天再次设置java的环境变量,突然发现每次设置都只是按照步骤一步步将其设置完,并不了解为啥要设置,于是上网找了找,找到遍文章,觉得不错,就留下了。