当前位置:  编程技术>java/j2ee

jdbc中class.forname的作用

    来源: 互联网  发布时间:2014-11-01

    本文导语:  使用JDBC时,我们都会很自然得使用下列语句: 代码如下:Class.forName("com.mysql.jdbc.Driver");   String url = "jdbc:mysql://127.0.0.1/test?useUnicode=true&characterEncoding=utf-8";   String user = "";   String psw = "";   Connection con = DriverManager.getConnection(url...

使用JDBC时,我们都会很自然得使用下列语句:

代码如下:

Class.forName("com.mysql.jdbc.Driver");  
String url = "jdbc:mysql://127.0.0.1/test?useUnicode=true&characterEncoding=utf-8";  
String user = "";  
String psw = "";  
Connection con = DriverManager.getConnection(url,user,psw); 

为什么说很自然呢,因为无论是网上还是书本教程上得例子都是这样的,而且程序也确实正常运行了,于是大家也就心安理得的找葫芦画瓢下去了。
一定要有这一句吗?不是的,我们完全可以用这样一句代替它:

代码如下:

com.mysql.jdbc.Driver driver = new com.mysql.jdbc.Driver();  
//or:  
//new com.mysql.jdbc.Driver(); 
String url = "jdbc:mysql://127.0.0.1/test?useUnicode=true&characterEncoding=utf-8";  
String user = "";  
String psw = "";  
Connection con = DriverManager.getConnection(url,user,psw);

大家可能都看出个大概来了,我们只需要在调用DriverManager的getConnection方法之前,保证相应的Driver类已经被加载到jvm中,并且完成了类的初始化工作就行了,而具体是怎样实现这个功能却是没有讲究的。上面两种方法都可以实现这个功能,因此程序可以正常运行。注意了,如果我们进行如下操作,程序是不能正常运行的,因为这样仅仅使Driver类被装载到jvm中,却没有进行相应的初始化工作。

代码如下:

com.mysql.jdbc.Driver driver = null;  
//or:  
ClassLoader cl = new ClassLoader();  
cl.loadClass("com.mysql.jdbc.Driver"); 

我们都知道JDBC是使用Bridge模式进行设计的,DriverManager就是其中的Abstraction,java.sql.Driver是Implementor,com.mysql.jdbc.Driver是Implementor的一个具体实现(请参考GOF的Bridge模式的描述)。大家注意了,前一个Driver是一个接口,后者却是一个类,它实现了前面的Driver接口。
Bridge模式中,Abstraction(DriverManager)是要拥有一个Implementor(Driver)的引用的,但是我们在使用过程中,并没有将Driver对象注册到DriverManager中去啊,这是怎么回事呢?jdk文档对Driver的描述中有这么一句:
When a Driver class is loaded, it should create an instance of itself and register it with the DriverManager
哦,原来是com.mysql.jdbc.Driver在装载完后自动帮我们完成了这一步骤。源代码是这样的:

代码如下:

package com.mysql.jdbc  

public class Driver extends NonRegisteringDriver implements java.sql.Driver {  
 // ~ Static fields/initializers 
 // Register ourselves with the DriverManager 
 // 
 static {  
    t ry {  
              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() 
 }  
}

PS:改修JDBC驱动的装载

代码如下:

ClassLoader cl = Thread.currentThread().getContextClassLoader();
Class clazz = cl.loadClass("com.mysql.jdbc.Driver");
clazz.newInstance();
Connection conn = DriverManager.getConnection("jdbcurl");

同样可以执行。但是这样就多构造了一个com.mysql.jdbc.Driver实例。同Class.forName("com.mysql.jdbc.Driver")。

即:

代码如下:

Class.forName("com.mysql.jdbc.Driver")==cl.loadClass("com.mysql.jdbc.Driver").newInstance();

Class.forName和 ClassLoader.loadClass是两码事,一个实例化类,一个加载类


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • JDBC连接出错:JdbcCheckup.java:19: Class
  • jsp连接sqlserver使用jdbc驱动时,class not found
  • Myeclipse中自带Tomcat的JDBC连接池配置(mysql和mssql)
  • 关于JDBC-ODBC和JDBC的区别 iis7站长之家
  • mysql jdbc连接mysql数据库步骤及常见参数详解
  • 关于JDBC-ODBC和JDBC的区别
  • JDBC驱动代理 HA-JDBC
  • 访问MS SQL能不能直接用JDBC,如果能相应的JDBC Driver从哪里得到?
  • easy question:jdbc与jdk需要分别安装吗。如何设置jdbc的classpath
  • JDBC 工具包 Midao JDBC
  • 请问JDBC和JDBC-ODBC有什么区别?是不是连接的时候也有所不同。
  • JDBC 驱动程序 Drizzle-JDBC
  • JDBC执行日志 JDBC Logger
  • OLAP数据源的JDBC驱动 Jdbc4Olap
  • 讨论:纯java的JDBC与JDBC-ODBC桥的比较?那种效率高、快?(面向服务端)
  • jdbc1.2 jdbc2.0里面的类是干什么用的?
  • 请问连接本机数据库的JDBC,和连接远程的JDBC有没有区别?
  • jdbc连接数据库,能否有jdbc中的方法进行安全设置:
  • 百万火急:一个 jsp的jdbc的问题,用的是jdbc,odbc桥。
  • 问一个简单的问题,我装了oracle 8.05,我并没有发有发现JDBC这个目录,是不是我要下载jdbc for oracle。
  • jdbc 连接sybase11.9时出错,错误提示:JZ0D5: 装载协议 com.sybase.jdbc2.tds.tds 时出错
  • java开发数据库,一般是用JDBC-ODBC桥,还是JDBC驱动程序连接数据库呢?
  • 请问有没有mdb的jdbc驱动?我不想用jdbc-odbc了.


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3