JDBC实现如何工作
在JDBC中,我看到Connection
是一个接口,它定义了与数据库交互的方法。JDBC实现如何工作
我也知道,接口只包含抽象方法,不能被实例化
但在JDBC代码,如何做下面的工作,
Connection connection = DriverManager.getConnection("URL String");
Statement statement=connection.createStatement();
按我的疑问createStatement()
应该是一个抽象方法这一点,即没有任何身体
但是每一件事情正常工作......这个
任何人都可以解释一下吗?
DriverManager.getConnection
返回一个实现Connection
接口的对象 - 幕后有一个真实的对象。
定义抽象类(或接口)的要点是要有抽象类(或实现接口的类)的子类,为抽象类(或接口)的所有抽象方法提供实现。否则,抽象类或接口永远不能使用,并且完全没有意义。
那么,做什么的DriverManager.getConnection,其实是以下内容:根据URL
return new MySqlConnection();
或
return new OracleConnection();
(这是一个过于简单化的解释在现实中,这是一个比这更复杂一点)。
和的MySqlConnection和的OracleConnection是实现连接接口的具体类:
public class MySQLConnection implements Connection {
...
}
这不是什么'DriverManager'正在做什么,如果它是必须知道'Connection'的每个实现,它不能。实际发生的是服务提供者机制(http://docs.oracle.com/javase/7/docs/technotes/guides/jar/jar.html#Service%20Provider)的组合,用于注册' java.sql.Driver'与'java.sql.DriverManager' – 2014-10-27 09:04:21
因此注释:“这是一个过于简单的解释,实际上,它比这更复杂一点”。这里的重点不是解释服务提供者机制,反思等等。重点是解释一下实现Connection的具体类的动机被创建并返回。 – 2014-10-27 10:14:16
非常感谢@JB Nizet,这是清楚的解释 – Harsha 2014-10-27 10:16:59
接口引用可以指向实现该接口的类的任何对象
即见下面的例子:
interface Foo{
void display();
}
public class TestFoo implements Foo{
void display(){
System.out.println(“Hello World”);
}
public static void main(String[] args){
Foo foo = new TestFoo();
foo.display();
}
}
JDBC就像任何驱动机制一样 - 人们和Sun(现在的Oracle)定义了Java将用来与数据库交互的接口(或合约)。那时数据库供应商的责任就是提供该接口的实现,以便他们的特定数据库能够与Java一起使用。
这里要说的是,JDBC API定义了Java将与数据库进行交互的标准接口,显而易见的好处是,如果您的代码只使用JDBC API,则无论数据库如何,它都会相当统一你可以使用,这意味着你可以将一个实现与另一个实现交换(尽管在实践中并不总是那么简单)。
关于如何将JDBC API的实现注册到java.sql.DriverManager,以前发生的情况是您的代码需要明确加载实现java.sql.Driver的类;加载该课程的行为导致它被注册到java.sql.DriverManager。这种机制现在已经将其与service provider替换,但最终的结果还是一样:
一个或多个java.sql.Driver实现与java.sql.DriverManager注册。
如果你再看看为java.sql.DriverManager.getConnection(String)的源代码,你会看到,它只是通过注册的驱动程序循环,直到它找到一个接受连接的URL在该点java.sql.DriverManager调用java.sql.Driver.connect(String, Properties)方法,返回一个具体实施java.sql.Connection。
它提供了实现接口的类。 – EJP 2014-10-27 08:53:08
尝试'System.out.println(connection.getClass());'。 – chrylis 2014-10-27 08:55:08