使用JDBC时,我们都会很自然得使用下列语句:
- Class.forName( "com.mysql.jdbc.Driver" );
- Stringurl= "jdbc:mysql://127.0.0.1/test?useUnicode=true&characterEncoding=utf-8" ;
- Stringuser= "" ;
- Stringpsw= "" ;
- Connectioncon=DriverManager.getConnection(url,user,psw);
为什么说很自然呢,因为无论是网上还是书本教程上得例子都是这样的,而且程序也确实正常运行了,于是大家也就心安理得的找葫芦画瓢下去了。
一定要有这一句吗?不是的,我们完全可以用这样一句代替它:
- com.mysql.jdbc.Driverdriver= new com.mysql.jdbc.Driver();
- //or:
- //newcom.mysql.jdbc.Driver();
- Stringurl= "jdbc:mysql://127.0.0.1/test?useUnicode=true&characterEncoding=utf-8" ;
- Stringuser= "" ;
- Stringpsw= "" ;
- Connectioncon=DriverManager.getConnection(url,user,psw);
大家可能都看出个大概来了,我们只需要在调用DriverManager的getConnection方法之前,保证相应的Driver类已经被加载到 jvm中,并且完成了类的初始化工作就行了,而具体是怎样实现这个功能却是没有讲究的。上面两种方法都可以实现这个功能,因此程序可以正常运行。注意了, 如果我们进行如下操作,程序是不能正常运行的,因为这样仅仅使Driver类被装载到jvm中,却没有进行相应的初始化工作。
- com.mysql.jdbc.Driverdriver= null ;
- //or:
- ClassLoadercl= 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{
- //~Staticfields/initializers
- //---------------------------------------------//
- //RegisterourselveswiththeDriverManager
- //
- static {
- try{
- java.sql.DriverManager.registerDriver( new Driver());
- } catch (SQLExceptionE){
- throw new RuntimeException( "Can'tregisterdriver!" );
- }
- }
- //~Constructors
- //-----------------------------------------------------------
- /**
- *ConstructanewdriverandregisteritwithDriverManager
- *
- *@throwsSQLException
- *ifadatabaseerroroccurs.
- */
- public Driver() throws SQLException{
- //RequiredforClass.forName().newInstance()
- }
- }
- 这里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-odbc驱动包,提示找不到驱动,java.lang.ClassNotFoundException: sun.jdbc.odbc.JdbcOdbcDriver, 原因:从jdk从1.8开始,删除了jdbc-odbc桥,所以odbc的驱动是用不了的 解决方法:这里为提供一个解决JDK1.8不...
主要介绍了使用JDBC操作MySQL需要添加Class.forName("com.mysql.jdbc.Driver")的相关知识,非常不错,具有一定的参考借鉴价值 ,需要的朋友可以参考下
java连接各种数据库的驱动 jar包 orale: Class.forName("oracle.jdbc.driver.OracleDriver"); mysql:Class.forName("com.mysql.jdbc.Driver"); access:Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); sqlsever:...
//或者Class.forName("com.mysql.jdbc.Driver"); String url ="jdbc:mysql://localhost/myDB? user=soft&password=soft1234&useUnicode=true&characterEncoding=8859_1" //myDB为数据库名 Connection conn= ...
对SPI,理论联系实际的理解
jdbc连接jdbc.class 可用于记事版 与数据库连接
如果熟悉使用JDBC来连接数据库的同学一定很清楚连接数据库的代码中一定会有依据Class.forName (com.mysql.jdbc.Driver); public static Connection getConnection() throws ClassNotFoundException, SQLException ...
java链接sqlserver数据库包如下错误时: java.lang.ClassNotFoundException: ... at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Unknown Source) 添加sqljdbc4-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 ...
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); //Sql Server7.0/2000 数据库 Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance(); //DB2 数据库 Class.froName(...
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
Class.forName( "oracle.jdbc.driver.OracleDriver" ); con = DriverManager.getConnection( "jdbc:oracle:thin:@127.0.0.1:1521:ORCL", "scott", ”tiger”); 连接SqlServer2000 msbase.jar ...
其中classes12.jar是从oracle安装目录中获取的,使用它编写java程序连接oracle时,驱动包的加载路径为"oracle.jdbc.driver.OracleDriver",即Class.forName("oracle.jdbc.driver.OracleDriver")。另一个ojdbc6.jar的...
Java连接SQL server数据库驱动,文件包含sqljdb和sqljdbc4 ...sqljdbc:Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); sqljdbc4:Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
使用JDBC-ODBC桥驱动程序连接数据库 基本步骤: ...o(2)通过DriverManager获取数据库连接 o(3)通过Connection对象获取Statement对象 o(4)使用Statement接口执行SQL语句 ...Class.forName("DriverName");
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); //Sql Server7.0/2000数据库 Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance(); //DB2数据库 Class....
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //装载数据库驱动 Connection con=DriverManager.getConnection(dbURL,user,password); //得到连接 System.out.println(con.getCatalog()); //打印...
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 ...
Java写了一个连接Access数据库... Class.forName("com.hxtt.sql.access.AccessDriver").newInstance(); url = "jdbc:Access:///D:/dataAnalysis/accessDB.mdb"; connect = DriverManager.getConnection(url, "", "");