2012-07-22 89 views
4

我正在使用包java.sql中的接口連接java.sql.Connection接口的實現在哪裏?

其實我雖然它是一個類,但當我試圖查看源代碼時,我發現它是一個接口。

在Connection接口的源代碼中,每個方法只有一行,沒有任何實現!

是什麼讓這個接口起作用呢?

數據庫連接的:mysql

連接源代碼頁: http://www.docjar.com/html/api/java/sql/Connection.java.html

+0

你試圖連接什麼類型的數據庫? – 2012-07-22 22:15:47

+0

@drumboog:我正在嘗試連接到MySql – malhobayyeb 2012-07-22 22:16:46

回答

9

它不是「工作」的接口,而是它的一個實現,它是特定於您的特定RDBMS供應商的接口。實際上,它通常是供應商提供的Connection接口的實現。

當您通過註冊JDBC驅動程序調用

Connection conn = DriverManager.getConnection(
    "jdbc:jdbc:mysql://localhost:3306/ 
, connectionProps); 

驅動程序管理器搜索,找到一個對MySQL(它知道它的MySQL從連接字符串),通過連接屬性的類的MySQL JDBC內部構造實現Connection的驅動程序,並將合成的Connection實例返回給您。例如,驅動程序可能會返回實現Connection的程序包私有類MySqlConnection的實例,並且程序將使用它與RDBMS進行交互,而無需瞭解有關該類的任何詳細信息,但實際上它實現Connection

+1

DriverManager不知道哪個是MySQL驅動程序,它只會查詢每個註冊的驅動程序,並詢問該驅動程序是否會接受該URL(使用'acceptsURL'),第一個返回true的查詢將被要求創建連接。 – 2012-07-24 18:33:08

+0

@MarkRotteveel對,就是它「知道」它是MySQL驅動程序。我忽略了駕駛員管理員將駕駛員的具體實施情況作爲一個複雜的細節進行反覆試驗的過程的細節,這對於OP對該問題的理解並不重要。 – dasblinkenlight 2012-07-24 18:42:58

2

MySQL驅動(http://www.mysql.com/products/connector/)包含實際的執行情況。 java.sql.Connection接口只是定義了JDBC標準所期望的方法。每個數據庫驅動程序必須定義如何實際連接。

+0

但我使用Connection來創建我的對象?編譯器如何知道這不是空的接口,而是實現的驅動程序? – malhobayyeb 2012-07-22 22:19:25

+0

你是如何創建連接的? DriverManager的?來自網絡(JNDI資源)?直接實例化它? DriverManager使用一個url來確定要創建哪種類型的Connection對象。在Web容器中使用JNDI資源時,必須配置服務器以告訴它應該使用的實際類型。如果你直接實例化它,那麼你只需說'Connection conn = new MySQLConnection()'(不知道該類名是否正確)。前兩個選項之一是最好的。 – 2012-07-22 22:25:45

1

下面是直接或間接實現java.sql.Connection接口類的一些例子:

  • oracle.jdbc。 OracleConnectionWrapper
  • com.mysql.jdbc。 ConnectionImpl
  • com.microsoft。 sqlserver.jdbc。 SQLServerConnection

通過包命名空間,您可以從哪個jdbc驅動程序中知道它們來自哪個。 但是這些和其他實現類不能直接使用。正如dasblinkenlight指出的那樣,您應該針對JDBC API進行編程,而不是針對每個JDBC驅動程序庫中提供的類進行編程。使用API​​將允許您切換RDBMS,而不會破壞您的Java數據訪問代碼。

有趣的是,這些日子越來越少的人使用JDBC API。許多人使用基於JDBC的對象關係映射框架,比如Hibernate。