`

使用JDBC时Class.Forname()的作用

阅读更多

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

java 代码
  1. Class.forName( "com.mysql.jdbc.Driver" );
  2. Stringurl= "jdbc:mysql://127.0.0.1/test?useUnicode=true&characterEncoding=utf-8" ;
  3. Stringuser= "" ;
  4. Stringpsw= "" ;
  5. Connectioncon=DriverManager.getConnection(url,user,psw);


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

java 代码
  1. com.mysql.jdbc.Driverdriver= new com.mysql.jdbc.Driver();
  2. //or:
  3. //newcom.mysql.jdbc.Driver();
  4. Stringurl= "jdbc:mysql://127.0.0.1/test?useUnicode=true&characterEncoding=utf-8" ;
  5. Stringuser= "" ;
  6. Stringpsw= "" ;
  7. Connectioncon=DriverManager.getConnection(url,user,psw);

 

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

java 代码
  1. com.mysql.jdbc.Driverdriver= null ;
  2. //or:
  3. ClassLoadercl= new ClassLoader();
  4. 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在装载完后自动帮我们完成了这一步骤。源代码是这样的:

java 代码
  1. package com.mysql.jdbc
  2. public class Driver extends NonRegisteringDriver implements java.sql.Driver{
  3. //~Staticfields/initializers
  4. //---------------------------------------------//
  5. //RegisterourselveswiththeDriverManager
  6. //
  7. static {
  8. try{
  9. java.sql.DriverManager.registerDriver( new Driver());
  10. } catch (SQLExceptionE){
  11. throw new RuntimeException( "Can'tregisterdriver!" );
  12. }
  13. }
  14. //~Constructors
  15. //-----------------------------------------------------------
  16. /**
  17. *ConstructanewdriverandregisteritwithDriverManager
  18. *
  19. *@throwsSQLException
  20. *ifadatabaseerroroccurs.
  21. */
  22. public Driver() throws SQLException{
  23. //RequiredforClass.forName().newInstance()
  24. }
  25. }
  26. 这里ClassLoader为什么不行,是类加载器的机制决定的 www.javaeye.com/topic/25053

    static块在什么时候执行?
    1)当调用forName(String)载入class时执行,如果调用ClassLoader.loadClass并不会执行.forName(String,false,ClassLoader)时也不会执行.
    2)如果载入Class时没有执行static块则在第一次实例化时执行.比如new ,Class.newInstance()操作
    3)static块仅执行一次

分享到:
评论

相关推荐

    jdbc中class.forname的作用

    主要介绍了jdbc中class.forname的作用,使用示例说明了他作用及使用方法,大家参考使用吧

    sun.jdbc.odbc.JdbcOdbcDriver下载

    jdbc-odbc驱动包,提示找不到驱动,java.lang.ClassNotFoundException: sun.jdbc.odbc.JdbcOdbcDriver, 原因:从jdk从1.8开始,删除了jdbc-odbc桥,所以odbc的驱动是用不了的 解决方法:这里为提供一个解决JDK1.8不...

    浅析使用JDBC操作MySQL需要添加Class.forName("com.mysql.jdbc.Driver")

    主要介绍了使用JDBC操作MySQL需要添加Class.forName("com.mysql.jdbc.Driver")的相关知识,非常不错,具有一定的参考借鉴价值 ,需要的朋友可以参考下

    java连接多种数据库的驱动

    java连接各种数据库的驱动 jar包 orale: Class.forName("oracle.jdbc.driver.OracleDriver"); mysql:Class.forName("com.mysql.jdbc.Driver"); access:Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); sqlsever:...

    jdbc驱动程序实例

    //或者Class.forName("com.mysql.jdbc.Driver"); String url ="jdbc:mysql://localhost/myDB? user=soft&password=soft1234&useUnicode=true&characterEncoding=8859_1" //myDB为数据库名 Connection conn= ...

    注册驱动:Class.forName(xxx.Driver).xmind

    对SPI,理论联系实际的理解

    jdbc.class

    jdbc连接jdbc.class 可用于记事版 与数据库连接

    浅析使用JDBC操作MySQL需要添加Class.forName(“com.mysql.jdbc.Driver”)

    如果熟悉使用JDBC来连接数据库的同学一定很清楚连接数据库的代码中一定会有依据Class.forName (com.mysql.jdbc.Driver); public static Connection getConnection() throws ClassNotFoundException, SQLException ...

    jdbc--sqljdbc4-2.0.jar

    java链接sqlserver数据库包如下错误时: java.lang.ClassNotFoundException: ... at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Unknown Source) 添加sqljdbc4-2.0包即可

    sql jdbc 2.0.1607.1 UNIX

    Therefore, applications do not need to call the Class.forName method to register or load the driver when using the sqljdbc4.jar class library. When the getConnection method of the DriverManager ...

    jdbc笔记整理 sql

    Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); //Sql Server7.0/2000 数据库 Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance(); //DB2 数据库 Class.froName(...

    hive-jdbc-2.1.0-standalone.jar

    at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Unknown Source) at com.trs.gateway.commons.hive.HiveFeature.getConnection(HiveFeature.java:55) ... 8 more

    JDBC连接各种数据代码.doc

    Class.forName( "oracle.jdbc.driver.OracleDriver" ); con = DriverManager.getConnection( "jdbc:oracle:thin:@127.0.0.1:1521:ORCL", "scott", ”tiger”); 连接SqlServer2000 msbase.jar ...

    Oracle数据库的JDBC驱动包

    其中classes12.jar是从oracle安装目录中获取的,使用它编写java程序连接oracle时,驱动包的加载路径为"oracle.jdbc.driver.OracleDriver",即Class.forName("oracle.jdbc.driver.OracleDriver")。另一个ojdbc6.jar的...

    sqljdbc_sqljdbc4.zip

    Java连接SQL server数据库驱动,文件包含sqljdb和sqljdbc4 ...sqljdbc:Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); sqljdbc4:Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

    Java使用JDBC连接数据库.docx

    使用JDBC-ODBC桥驱动程序连接数据库 基本步骤: ...o(2)通过DriverManager获取数据库连接 o(3)通过Connection对象获取Statement对象 o(4)使用Statement接口执行SQL语句 ...Class.forName("DriverName");

    java连接数据库字符串

    Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); //Sql Server7.0/2000数据库 Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance(); //DB2数据库 Class....

    Java使用数据源配置数据库.rar

      Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //装载数据库驱动   Connection con=DriverManager.getConnection(dbURL,user,password); //得到连接   System.out.println(con.getCatalog()); //打印...

    sql jdbc 2.0

    Therefore, applications do not need to call the Class.forName method to register or load the driver when using the sqljdbc4.jar class library. When the getConnection method of the DriverManager ...

    Access_JDBC30.jar --Java JDK1.8实现与Access数据库连接

    Java写了一个连接Access数据库... Class.forName("com.hxtt.sql.access.AccessDriver").newInstance(); url = "jdbc:Access:///D:/dataAnalysis/accessDB.mdb"; connect = DriverManager.getConnection(url, "", "");

Global site tag (gtag.js) - Google Analytics