DriverManager.registerDriver(new com.mysql.jdbc.Driver());
在java中用这种方式注册驱动,程序出错,有包
用Class.forName("com.mysql.jdbc.Driver")这个就没有错

解决方案 »

  1.   

    Class.forName("com.mysql.jdbc.Driver")这句话表示加载驱动。至于为什么这样会加载驱动呢?因为 JDBC 规范要求在 Driver 实现类的静态块中使用 DriverManager.registerDriver 方法把自己注册给驱动管理器。根据 Java 类加载的规定,在类加载时除了会初始化类的信息之外,还会初始化所有 static 的东西,比如静态块、静态成员、静态方法,以及静态内部类。DriverManager.registerDriver 方法不是给开发人员使用的,这是给 JDBC 驱动厂商用的。
      

  2.   


    一直用的都是String url="com.mysql.jdbc.Driver"; class.forName(url);的方式注册驱动。
    原理是运动reflecting(反射)机制把引用名为com.mysql.jdbc.Driver的Driver对象的构造信息写入堆中的方法区。而且会调用Driver的无参构造方法在完成实例化。。
    而new com.mysql.jdbc.Driver()通过new 一个对象的引用来当做registerDriver()方法的参数有点让人想不太通。恭请楼主按照原始的套路。
      

  3.   

    上面的方法其实也可以的:
                   DriverManager.registerDriver(new com.mysql.jdbc.Drive());               Connection conn=DriverManager.getConnection(url,user,pwd);
    楼上的你们都说错了吧!  这种方式是可以的,不信自己试试去!
      

  4.   

    确实,Driver.registerDriver(new com.mysql.jdbc.Driver())这种方法会导致程序两次注册驱动,
    我用这种方式的时候,一写完就出错,错误时找不到这个类,
    用Class.forName("com.mysql.jdbc.Driver")是时候,程序都可以运行起来,证明驱动有效,
    是不是可能在其它的地方存在错误
      

  5.   

    “在加载某一 Driver 类时,它应该创建自己的实例并向 DriverManager 注册该实例。这意味着用户可以通过调用以下程序加载和注册一个驱动程序”
    那如何才能自动注册呢,有一点需要注意的就是Class.forName就可以注册,只能将注册信息添加到静态代码中,所有Driver代码的实现类中都采用了 
        static {
            try {
                DriverManager.registerDriver(new ProxoolDriver());
            } catch (SQLException e) {
                System.out.println(e.toString());
            }
        }
    这种方式进行注册,这样在Class.forName的时候就会执行上面的代码,也就想系统注册驱动程序,注册驱动程序就是他会组装DriverInfo 后缓存到DriverManager中,便于后面进行处理
      

  6.   

    DriverManager 类包含一列 Driver 类,它们已通过调用方法 DriverManager.registerDriver 对自己进行了注册。所有 Driver 类都必须包含有一个静态部分。它创建该类的实例,然后在加载该实例时 DriverManager 类进行注册。这样,用户正常情况下将不会直接调用 DriverManager.registerDriver;而是在加载驱动程序时由驱动程序自动调用。