2014-10-27 86 views
4

在JDBC中,我看到Connection是一个接口,它定义了与数据库交互的方法。JDBC实现如何工作

我也知道,接口只包含抽象方法,不能被实例化

但在JDBC代码,如何做下面的工作,

Connection connection = DriverManager.getConnection("URL String"); 

Statement statement=connection.createStatement(); 

按我的疑问createStatement()应该是一个抽象方法这一点,即没有任何身体

但是每一件事情正常工作......这个

任何人都可以解释一下吗?

+0

它提供了实现接口的类。 – EJP 2014-10-27 08:53:08

+1

尝试'System.out.println(connection.getClass());'。 – chrylis 2014-10-27 08:55:08

回答

6

DriverManager.getConnection返回一个实现Connection接口的对象 - 幕后有一个真实的对象。

3

定义抽象类(或接口)的要点是要有抽象类(或实现接口的类)的子类,为抽象类(或接口)的所有抽象方法提供实现。否则,抽象类或接口永远不能使用,并且完全没有意义。

那么,做什么的DriverManager.getConnection,其实是以下内容:根据URL

return new MySqlConnection(); 

return new OracleConnection(); 

(这是一个过于简单化的解释在现实中,这是一个比这更复杂一点)。

和的MySqlConnection和的OracleConnection是实现连接接口的具体类:

public class MySQLConnection implements Connection { 
    ... 
} 
+0

这不是什么'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

+0

因此注释:“这是一个过于简单的解释,实际上,它比这更复杂一点”。这里的重点不是解释服务提供者机制,反思等等。重点是解释一下实现Connection的具体类的动机被创建并返回。 – 2014-10-27 10:14:16

+0

非常感谢@JB Nizet,这是清楚的解释 – Harsha 2014-10-27 10:16:59

1

接口引用可以指向实现该接口的类的任何对象
即见下面的例子:

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(); 
} 

} 
4

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