2014-10-27 70 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