jdbc中class.forname的作用

使用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是两码事,一个实例化类,一个加载类

(0)

相关推荐

  • 浅析JAVA常用JDBC连接数据库的方法总结

    一.JDBC连接DB2 复制代码 代码如下: Class.forName("Com.ibm.db2.jdbc.net.DB2Driver");   String url="jdbc:db2://dburl:port/DBname"   cn = DriverManager.getConnection( url, sUsr, sPwd );  Class.forName("Com.ibm.db2.jdbc.net.DB2Driver"); Stri

  • JDBC之PreparedStatement类中预编译的综合应用解析

    预编译的优点1.PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程. 2.使用 Statement 对象.在对数据库只执行一次性存取的时侯,用 Statement 对象进行处理.PreparedStatement 对象的开销比Statement大,对于一次性操作并不会带来额外的好处. 3.statement每次执行sql语句,相关数据库都要执行sql语句的编译,preparedstatement是预编译得,   preparedstatement支

  • 深入JDBC sqlserver连接写法的详解

    SQL Server 2000 复制代码 代码如下: String driverName = "com.microsoft.jdbc.sqlserver.SQLServerDriver";String dbURL = "jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=sample"; SQL Server 2005和SQL Server 2008 复制代码 代码如下: String driverName

  • jdbc调用mysql存储过程实现代码

    1. 创建存储过程 建立一个MySQL的存储过程 add_pro 复制代码 代码如下: delimiter // drop procedure add_pro // create procedure add_pro(a int , b int , out sum int ) begin set sum = a * b; end; // 2. 调用存储过程 复制代码 代码如下: package com.zhanggaosong; import java.sql.CallableStatement;

  • jdbc连接数据库步骤深刻分析

    创建一个以JDBC连接数据库的程序,包含7个步骤: 1.加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机), 这通过java.lang.Class类的静态方法forName(String className)实现. 例如: 复制代码 代码如下: try{ //加载MySql的驱动类 Class.forName("com.mysql.jdbc.Driver") ; }catch(ClassNotFoundException e){ Sys

  • 解析jdbc处理oracle的clob字段的详解

    import java.io.BufferedOutputStream;import java.io.ByteArrayInputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.io.Reader;import java.sql.Clob;import java.sql.Connection;import java.sql.ResultSet;

  • 基于jdbc处理Clob的使用介绍

    保存clob字段,可以像这样: Clob clob=con.createClob();  clob.setString(1, new String(lineWKT));  pre.setClob(1, clob); 读取clob 可以像这样: while(rs.next()){   Clob c=rs.getClob("WKT");   InputStream is=c.getAsciiStream();   response=IOUtils.toString(is);   is.cl

  • 如何在Eclipse中设置Oracle的JDBC

    第一步:找到jdbc驱动我用的oracle自带的,ORACLE_HOME]\jdbc\lib\ 下面有各种jdbc,一定要注意兼容问题,具体看第二步,分别用哪个文件. 第二步:把驱动的路径加在环境变量classpath内- Add [ORACLE_HOME]\jdbc\lib\classes111.zip and[ORACLE_HOME]\jdbc\lib\nls_charset11.zip to your CLASSPATH.(Add classes12.zip and nls_charset

  • JDBC连接集群数据库的方法

    在连接数据库的url地址有点不一样 复制代码 代码如下: jdbc:oracle:thin:@(DESCRIPTION=(LOAD_BALANCE=on)(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=IP1)(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=IP2)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=服务名))) url=jdbc:oracle:thin:@(DESCRIPTIO

  • 经常使用的JDBC连接数据库方式

    一.JDBC连接DB2 复制代码 代码如下: Class.forName("Com.ibm.db2.jdbc.net.DB2Driver"); String url="jdbc:db2://dburl:port/DBname" cn = DriverManager.getConnection( url, sUsr, sPwd ); 二.JDBC连接Microsoft SQLServer(microsoft) 复制代码 代码如下: Class.forName( &qu

  • JDBC数据库的使用操作总结

    JDBC是一组能够执行SQL语句的API 由于传统的数据库操作方式需要程序员掌握各个不同的数据库的API,极其不便 因此java定义了JDBC这一标准的接口和类,为程序员操作数据库提供了统一的方式 JDBC的操作方式比较单一,由五个流程组成: 1.通过数据库厂商提供的JDBC类库向DriverManager注册数据库驱动 2.使用DriverManager提供的getConnection()方法连接到数据库 3.通过数据库的连接对象的createStatement方法建立SQL语句对象 4.执行

  • 解析使用jdbc,hibernate处理clob/blob字段的详解

    (1)不同数据库中对应clob,blob的类型:mysql中 : clob对应text  blob对应blobdb2/oracle中 clob对应clob blob对应blob (2)domain中对应类型:clob 对应 String   blob 对应 byte[]clob 对庆 java.sql.Clob blob 对应 java.sql.Blob (3)hibernate配置文件中对应类型:clob > clob   blob > binay 也可以直接使用数据库提供类型,例如:ora

  • java使用jdbc链接Oracle示例类分享

    复制代码 代码如下: public class OracleJdbcTest   {       String driverClass = "oracle.jdbc.driver.OracleDriver"; Connection con; public void init(FileInputStream fs) throws ClassNotFoundException, SQLException, FileNotFoundException, IOException       {

  • jdbc操作数据库的基本流程详解

    所有的JDBC应用程序都具有下面的基本流程: 1.加载数据库驱动并建立到数据库的连接. 2.执行SQL语句. 3.处理结果. 4.从数据库断开连接释放资源.下面我们就来仔细看一看每一个步骤:其实按照上面所说每个阶段都可得单独拿出来写成一个独立的类方法文件.共别的应用来调用.1.加载数据库驱动并建立到数据库的连接: 复制代码 代码如下: String driverName="com.mysql.jdbc.Driver";  String connectiionString="j

  • 常用数据库的驱动程序及JDBC URL分享

    常用数据库的驱动程序及 JDBC URL: Oracle 数据库 : 驱动程序包名: ojdbc14.jar 驱动类的名字: oracle.jdbc.driver.OracleDriver JDBC URL : jdbc:oracle:thin:@ dbip:port:databasename 说明:驱动程序包名有可能会变 JDBC URL 中黑色字体部分必须原封不动的保留,为该驱动识别的 URL 格式.红色字体部分需要根据数据库的安装情况填写.其中各个部分含义如下: dbip – 为数据库服务

  • 基于Java回顾之JDBC的使用详解

    尽管在实际开发过程中,我们一般使用ORM框架来代替传统的JDBC,例如Hibernate或者iBatis,但JDBC是Java用来实现数据访问的基础,掌握它对于我们理解Java的数据操作流程很有帮助. JDBC的全称是Java Database Connectivity. JDBC对数据库进行操作的流程:•连接数据库•发送数据请求,即传统的CRUD指令•返回操作结果集JDBC中常用的对象包括:•ConnectionManager•Connection•Statement•CallableStat

  • Java使用JDBC连接Oracle_MSSQL实例代码

    一.Statement 复制代码 代码如下: import java.sql.*; public class TestJDBC { public static void main(String[] args) {  Connection oracle_conn = null;  Statement oracle_stmt = null;  ResultSet oracle_rs = null; Connection mssql_conn = null;  Statement mssql_stmt

  • JDBC连接Access数据库的几种方式介绍

    接下来总结一下常用的几种连接方式. 例如有如下的Access数据库student,表basic,以及6条记录,现在通过几种方式在Jsp中将他们的数据显示出来.如图所示: 对于几种连接Access数据库的方式,基本上都是基于JDBC-ODBC方式的,当然也有纯JDBC驱动的方式.这里我暂时就不说了.对于这几种方式,除了取得连接之处不同外,其他的代码都是一样的.所以这里先写出取得连接的几种方式,然后再用完整的代码进行显示. 方式一:通过JDBC-ODBC方式桥连直接连接: 1.对于这种方式,首先要建

随机推荐