`

数据库驱动可否用new?

 
阅读更多
  1. Class.forName("com.mysql.jdbc.Driver");   
  2. String url = "jdbc:mysql://127.0.0.1/test?useUnicode=true&characterEncoding=utf-8";   
  3. String user = "";   
  4. String psw = "";   
  5. Connection con = DriverManager.getConnection(url,user,psw);  


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

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

 

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

java 代码
  1. com.mysql.jdbc.Driver driver = null;   
  2. //or:   
  3. ClassLoader cl = 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.   
  3. public class Driver extends NonRegisteringDriver implements java.sql.Driver {   
  4. // ~ Static fields/initializers   
  5. // --------------------------------------------- //   
  6. // Register ourselves with the DriverManager   
  7. //   
  8. static {   
  9.      t ry {   
  10.                java.sql.DriverManager.registerDriver(new Driver());   
  11.            } catch (SQLException E) {   
  12.               throw new RuntimeException("Can't register driver!");   
  13.            }   
  14.    }   
  15. // ~ Constructors   
  16. // -----------------------------------------------------------   
  17. /**
  18.    * Construct a new driver and register it with DriverManager
  19.    *
  20.    * @throws SQLException
  21.    *              if a database error occurs.
  22.    */  
  23. public Driver() throws SQLException {   
  24.      // Required for Class.forName().newInstance()   
  25. }   
  26. }  

在初始化一个类,生成一个实例的时候,newInstance()方法和new关键字除了一个是方 法,一个是关键字外,最主要有什么区别?它们的区别在于创建对象的方式不一样,前者是使用类加载机制,后者是创建一个新类。那么为什么会有两种创建对象方 式?这主要考虑到软件的可伸缩、可扩展和可重用等软件设计思想。

Java中工厂模式经常使用newInstance()方法来创建对象,因此从为什么要使用工厂模式上可以找到具体答案。 例如:
class c = Class.forName(“Example”);
factory = (ExampleInterface)c.newInstance();

其中ExampleInterface是Example的接口,可以写成如下形式:
String className = "Example";
class c = Class.forName(className);
factory = (ExampleInterface)c.newInstance();

进一步可以写成如下形式:
String className = readfromXMlConfig;//从xml 配置文件中获得字符串
class c = Class.forName(className);
factory = (ExampleInterface)c.newInstance();

上面代码已经不存在Example的类名称,它的优点是,无论Example类怎么变化,上述代码不变,甚至可以更换Example的兄弟类 Example2 , Example3 , Example4……,只要他们继承ExampleInterface就可以。

从JVM 的角度看,我们使用关键字new创建一个类的时候,这个类可以没有被加载。但是使用newInstance()方法的时候,就必须保证:1、这个 类已经加载;2、这个类已经连接了。而完成上面两个步骤的正是Class的静态方法forName()所完成的,这个静态方法调用了启动类加载器,即加载 java API的那个加载器。

现在可以看出,newInstance()实际上是把new这个方式分解为两步,即首先调用Class加载方法加载某个类,然后实例化。 这样分步的好处是显而易见的。我们可以在调用class的静态加载方法forName时获得更好的灵活性,提供给了一种降耦的手段。

最后用最简单的描述来区分new关键字和newInstance()方法的区别:
newInstance: 弱类型。低效率。只能调用无参构造。
new: 强类型。相对高效。能调用任何public构造

分享到:
评论

相关推荐

    通过vc编程访问数据库例子

    3. 通过事件驱动编程实现用户界面与数据库的交互。 4. ODBC或ADO接口的使用,以及与不同数据库系统的兼容性。 这个例子是一个很好的学习资源,可以帮助开发者理解如何在VC++环境中利用MFC进行数据库应用的开发。...

    JDBC连接Oracle数据库常见问题及解决方法

    应该先检查一下 Oracle 是否正常,用 sql*plus 连接一下数据库,看能否正常连接。 5. Weblogic 中使用 Oracle 连接池及 Oracle 备份的注意事项 在使用 Weblogic 连接 Oracle 数据库时,需要注意以下几点: * 配置...

    简单的测试数据库是否可以连通的工具

    5. **数据库引擎兼容性**:测试应用程序使用的数据库驱动程序是否与目标数据库版本兼容。 描述中提到,此工具能保证“是否能够真正连接到数据库”。这意味着它可能包括以下特性: - **尝试连接**:工具会尝试建立一...

    JDBC驱动加载分析

    ### JDBC驱动加载分析 #### 背景与概念 在Java开发中,JDBC (Java Database Connectivity) 是一种用于...此外,对于不同类型的数据库,开发者可以选择适合的JDBC驱动进行加载和使用,从而实现与数据库的有效交互。

    在myeclipse(java)中如何连接Oracle数据库

    ### 在MyEclipse中连接Oracle数据库的详细步骤与原理 #### 一、前言 在Java开发中,经常需要与数据库进行交互以实现...此外,还提到了一些注意事项和其他类型的数据库驱动,以帮助开发者更好地理解和应用相关技术。

    JSP com.mysql.jdbc.Driver‘. This is deprecated. The new d.pdf

    在JavaServer Pages (JSP)开发中,与数据库交互是一个常见的任务,而连接MySQL数据库时,通常会使用MySQL Connector/J,这是一个Java Database Connectivity (JDBC)驱动程序。然而,随着时间的推移,技术也在不断...

    WebLogic事务

    这种类型的驱动仍然依赖于本机数据库驱动程序。 - **Type 3 驱动**:通过网络协议实现的 JDBC 驱动。这类驱动通常独立于操作系统和数据库平台,具有较好的可移植性。 - **Type 4 驱动**:纯 Java 的 JDBC 驱动。不...

    乐优商城.xmind

    可以利用url直接查询数据库,能否访问得到数据 报错 启动类 没有扫描到 @MapperScan("com.leyou.item.mapper") ,目录结构关系 访问网页报错 CORS policy: No 'Access-Control-Allow-Origin' header is ...

    vba导出sqlite中需要筛选的数据

    在IT领域,特别是数据库操作与数据提取方面,VBA(Visual Basic for Applications)与SQLite的结合使用为数据处理提供了一种高效且灵活的方式。本文将深入解析如何利用VBA从SQLite数据库中筛选并导出特定数据,这...

    最新Java面试宝典pdf版

    stop()和suspend()方法为何不推荐使用? 29 47、sleep() 和 wait() 有什么区别? 30 48、同步和异步有何异同,在什么情况下分别使用他们?举例说明。 32 49. 下面两个方法同步吗?(自己发明) 33 50、多线程有几种...

    java面试题

    同步和异步,在什么情况下分别使用? 答:如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。 当...

    Sunone8配置应用服务器[定义].pdf

    配置完成后,务必进行"Ping"测试,以验证服务器能否成功连接到数据库。 JDBC(Java Database Connectivity)是Java编程语言与各种数据库交互的标准接口。在Sun ONE 8中配置JDBC数据源,可以通过"New"创建新的连接池...

    Java面试宝典-经典

    stop()和suspend()方法为何不推荐使用? 29 47、sleep() 和 wait() 有什么区别? 30 48、同步和异步有何异同,在什么情况下分别使用他们?举例说明。 32 49. 下面两个方法同步吗?(自己发明) 33 50、多线程有几种...

    java面试题大全(2012版)

    stop()和suspend()方法为何不推荐使用? 29 47、sleep() 和 wait() 有什么区别? 30 48、同步和异步有何异同,在什么情况下分别使用他们?举例说明。 32 49. 下面两个方法同步吗?(自己发明) 33 50、多线程有几种...

    Java面试宝典2012版

    stop()和suspend()方法为何不推荐使用? 29 47、sleep() 和 wait() 有什么区别? 30 48、同步和异步有何异同,在什么情况下分别使用他们?举例说明。 32 49. 下面两个方法同步吗?(自己发明) 33 50、多线程有...

    java面试宝典2012

    stop()和suspend()方法为何不推荐使用? 32 47、sleep() 和 wait() 有什么区别? 33 48、同步和异步有何异同,在什么情况下分别使用他们?举例说明。 36 49. 下面两个方法同步吗?(自己发明) 36 50、多线程有几种...

    Java面试宝典2012新版

    stop()和suspend()方法为何不推荐使用? 29 47、sleep() 和 wait() 有什么区别? 30 48、同步和异步有何异同,在什么情况下分别使用他们?举例说明。 32 49. 下面两个方法同步吗?(自己发明) 33 50、多线程有几种...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    而JSP的组件是用Java开发的,可以直接使用; 4、一次编写,处处运行:作为JAVA开发平台的一部分,JSP具有JAVA的所有优点,包括Write once , Run everywhere. 3.2. 数据库的选择 3.2.1. Web应用程序开发环境—SQL...

Global site tag (gtag.js) - Google Analytics