解决方案 »

  1.   

    驱动是通过静态块来加载的,比如说有这么一个类class A{
      static{
        System.out.println("A");
      }
    }1.A如何能被打印呢?要么Class.forName("A"),要么new A(),但是这里的A对象并没有什么实际作用,所以推荐使用前者
    2.Jdbc规定所有driver,包括sqlServerDriver,mySqlDriver,oracleDriver等都有这么个静态块来初始化DriverManager
    做的事简单说就是DriverManager.register(new ADriver()),因为sqlServerDriver等类是由各个数据库厂商写的,DriverManager是原来的Sun写的,用于连接Driver,Sun不知道市面上有哪些Driver,需要你主动告诉它你是谁。
    最早版本这是必须的,但是现在的版本由于这些数据库都是已经是常用的了,所以DriverManager内置知道去那里找,但是如果你自己写一个数据库的话或者用那些没有名气的数据库时这个就是必须的。
      

  2.   

    可以百度下:JAVA 服务提供者框架介绍
      

  3.   

    这种做法在以前是必须的,JDBC3.0之后能自动发现驱动通过jdbc连接数据库,需要驱动,这是毫无疑问的
    并且不同的库需要不同的驱动,那么问题来了,怎样选择具体使用那个驱动呢?答案是更具jdbc连接数据的URL来决定
    首先要向系统注册各种各样的驱动,当然这个可以根据需要来,如果确定只有一个数据库类型,那么注册一个就行了
    以前是手工注册,现在是自动注册。
    每次从DriverManager中获取连接时,会将url依次交由已注册的驱动列表中的驱动来检测,是否接受这个格式的url,直到第一个接受的驱动为止,如果所有的驱动都询问完毕后,依然没有愿意接受的,那么就爆no suiteable driver这样的异常所谓的加载,其实就是利用类加载的过程中会执行static代码块的原理,将自身注册进DriverManager的过程。
      

  4.   

    也就是说,如果一个不知名的数据库DriverManager内找不到的,就得DriverManger.register() 或者Class.forName() 是吗?
      

  5.   

    是这样的。不过实际数据库就这么几种,所以理论上不会出现这种情况。你可以这样想,我还是用sqlserver的jar包,但是我修改了jar包,只是把SQLServerDriver改名成,MySqlServerDriver,SQLServerDriver01等,实际上jar包的功能都是一样的,但是jdbc就傻眼了,我不告诉它,它就不可能知道我改成了什么东西。
      

  6.   

    是这样的。不过实际数据库就这么几种,所以理论上不会出现这种情况。你可以这样想,我还是用sqlserver的jar包,但是我修改了jar包,只是把SQLServerDriver改名成,MySqlServerDriver,SQLServerDriver01等,实际上jar包的功能都是一样的,但是jdbc就傻眼了,我不告诉它,它就不可能知道我改成了什么东西。
    谢谢