Java JDBC中的DriverManager概念是否基于提供者设计模式

Java JDBC中的DriverManager概念是否基于提供者设计模式,java,jdbc,Java,Jdbc,在JDBC中,我们使用 Class.forName(“com.microsoft.sqlserver.jdbc.SQLServerDriver”).newInstance() 方法将对象加载到内存中。然后,当我们使用DriverManager类获取到Sql Server的连接时,DriverManager会自动使用内存中加载的驱动程序集中的相应驱动程序。是否可以将DriverManager概念与.net中使用的提供程序设计模式进行比较?如果不是,那么我们所说的确切含义是什么 Class.forN

在JDBC中,我们使用

Class.forName(“com.microsoft.sqlserver.jdbc.SQLServerDriver”).newInstance()

方法将对象加载到内存中。然后,当我们使用DriverManager类获取到Sql Server的连接时,DriverManager会自动使用内存中加载的驱动程序集中的相应驱动程序。是否可以将DriverManager概念与.net中使用的提供程序设计模式进行比较?如果不是,那么我们所说的确切含义是什么

Class.forName(“com.microsoft.sqlserver.jdbc.SQLServerDriver”)

方法,为什么不使用新关键字创建sql server驱动程序类的对象?

类。forName(“XXXDriver”)
调用XXXDriver的静态块。 通常,静态块调用
DriverManager.registerDriver(new XXXDriver())
将自身注册到
DriverManager

比如:

public class XXXDriver implements Driver{
  static{
    //Be invoked by Class.forName("XXXDriver")
    DriverManager.registerDriver(new XXXDriver())
  }
...
}

不幸的是,我不知道.Net中的提供者模式。但这就是
Class.forName()
magic的作用

您不会通过
newInstance()
实例化该类
forName()
就足够了。(好的,我在BalusC的回答中看到了创建实例的原因。)


JDBC规范要求每个JDBC驱动程序向
DriverManager.registerDriver()注册自身。这是通过加载类时执行的静态块来完成的。类加载是通过
Class.forName()

启动的。请注意,对于JDBC 4.0驱动程序,不再需要这样做: