eclipse中使用 Class.forName("com.gjt.mm.mysql.Driver") 加载驱动和不加载驱动都可以正常连接mysql和操作啊, 这个驱动是不是在程序中加载一次就可以了,以后的程序都不需要加载?

解决方案 »

  1.   

    这个是mysql的数据库驱动啊。
      

  2.   

    Class.forName 表示加载一个类。加载一个类并没有实例化这个类,在加载类的同时会初始化这个类中所有的静态成员、静态块和静态方法。根据 JDBC 规范,Driver 的实现类必须在静态块中使用 DriverManager.registerDriver() 方法将自己注册到驱动管理器中去。这也就是需要执行 Class.forName 的原因。当然了,加载 JDBC 驱动还有其他的方法,Class.forName 只是其中之一。其他还有:* 在系统属性将 jdbc.drivers 属性的值设为 Driver 的实现类名* 实现 JDBC 4.0 规范的驱动以后不再需要 Class.forName 或者是 jdbc.drivers 了,其采用 Service Provider 方式加载驱动。因为 JDBC 4 规定 JDBC 的 jar 包必须在 META-INF/services/java.sql.Driver 文件中写出 Driver 的实现类。需要支持 JDBC 4 新特性的功能需要在 JDK 6 中运行,不过所有的 JDBC 驱动都是向下兼容的,因此 JDBC 4 的驱动在JDK 5 及以下版本无法使用 JDBC 4 中的新特性。MySQL 支持 JDBC 4 驱动版本是 Connector/J 5.0.0-beta 及以后版本
    Oracle 支持 JDBC 4 驱动版本是 ojdbc6.jar
    MS SQL Server 支持 JDBC 4 驱动版本是 Microsoft SQL Server JDBC Driver 2.0PS:com.gjt.mm.mysql.Driver 已经是很老的驱动了,那是 MySQL JDBC 驱动的作者 Mark Matthews 在加盟 MySQL 之前所使用的驱动,其中的 mm 就是作者的名字。在 Mark Matthews 加盟 MySQL 之后就改名为 Connector/J,驱动类名也改用 com.mysql.jdbc.Driver,而 mm 的驱动不再更新。目前,所有的 MySQL 驱动包都为了兼容性而保留了 com.gjt.mm.mysql.Driver,但是新开发的程序应使用 com.mysql.jdbc.Driver。
      

  3.   


    package org.gjt.mm.mysql;import java.sql.SQLException;public class Driver extends com.mysql.jdbc.Driver
    {
    }
    package com.mysql.jdbc;import java.sql.DriverManager;
    import java.sql.SQLException;public class Driver extends NonRegisteringDriver
      implements java.sql.Driver
    {
      static
      {
        try
        {
          DriverManager.registerDriver(new Driver());
        } catch (SQLException E) {
          throw new RuntimeException("Can't register driver!");
        }
      }
    }
      

  4.   

    不加载驱动是怎么连的?A call to forName("X") causes the class named X to be initialized.
    它返回的是X类的运行时Class discriptor 其内部涉及到获取ClassLoader// Returns the invoker's class loader, or null if none.
        // NOTE: This must always be invoked when there is exactly one intervening
        // frame from the core libraries on the stack between this method's
        // invocation and the desired invoker.
        static ClassLoader getCallerClassLoader() {
            // NOTE use of more generic Reflection.getCallerClass()
            Class caller = Reflection.getCallerClass(3);
            // This can be null if the VM is requesting it
            if (caller == null) {
                return null;
            }
            // Circumvent security check since this is package-private
            return caller.getClassLoader0();
        }假如forName是在Test类中调用的,caller就是Test类Class对象