2017-08-13 42 views
2

我創建了一個到mysql數據庫的連接。下面是我的代碼界面如何可以引用沒有實現接口的對象?

package org; 

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.SQLException; 
import java.sql.Statement; 
import java.sql.ResultSet; 

public class DatabaseConn { 

    public static void main(String[] args) { 

     System.out.println("Loading driver..."); 

     try { 
       Class.forName("com.mysql.jdbc.Driver"); 
       System.out.println("Driver loaded!"); 
     } catch (ClassNotFoundException e) { 
       throw new IllegalStateException("Cannot find the driver in the classpath!", e); 
    } 

     try { 
       String host = "jdbc:mysql://localhost:3306/sys"; 
       String username = "root"; 
       String password = "root"; 

       Connection Con = DriverManager.getConnection(host, username, password); 
       Statement stmnt = Con.createStatement(); 
       String SQL = "SELECT * FROM sys_config"; 
       ResultSet rs = stmnt.executeQuery(SQL); 

       System.out.println("Records:"+rs); 


    } catch (SQLException err) { 
       System.out.println(err.getMessage()); 
    } 

    } 
} 

我對類的接口實現的理解說,接口類型引用實現接口的類的對象。

但是,當我調查低於上述的代碼中使用的代碼片斷..

Connection Con = DriverManager.getConnection(host, username, password); 

的DriverManager.getConnection(主機,用戶名,密碼)返回(類型連接的)一個參照本發明的對象,但沒有接口被實現在類DriverManager中。任何人都可以清除我的這個懷疑..?或者我錯過了什麼?

同樣的事情,我不能夠得到下面的代碼片斷

Statement SQL = Con.createStatement(); 

Con.createStatement()應參考返回實現Statement接口一個對象。但這種連接接口由ConnectionImpl類實現,其執行存在類似下面

public class ConnectionImpl 
    extends ConnectionPropertiesImpl 
    implements Connection { 

    public Statement createStatement() 
     throws SQLException 
     { 
     return createStatement(1003, 1007); 
     } 

     public Statement createStatement(int resultSetType, int resultSetConcurrency) 
     throws SQLException 
     { 
     checkClosed(); 

     StatementImpl stmt = new StatementImpl(this, this.database); 
     stmt.setResultSetType(resultSetType); 
     stmt.setResultSetConcurrency(resultSetConcurrency); 

     return stmt; 
     } 

} 
+0

很明顯'StatementImpl'是一個實現'Statement'的類,'createStatement()'返回該類的一個實例。 – Eran

回答

3

讓我們來看看這點點滴滴:

DriverManager.getConnection(host, username, password)返回(Connection類型)的引用的對象..

這是正確的。

...但沒有接口實施在類DriverManager

這也是正確的。

你缺少的解釋是DriverManager.getConnection()不返回對DriverManager的引用。它返回一個對不同類的對象的引用,該類實現Connection接口。

假設爲參數的緣故,有一個叫MySqlConnection類:

class MySqlConnection implements Connection { 
    ... 
} 

現在,DriverManager.getConnection()很可能迴歸這個類的一個實例:

class DriverManager { 
    public Connection getConnection(...) { 
     return new MySqlConnection(...); 
    } 
} 

希望這將清除的東西了。

+0

我明白了你的觀點。請告訴我,在哪個班級連接的基礎上..?我的意思是哪個類實際上負責連接...從這裏檢查http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/sql/DriverManager .java#DriverManager.getConnection%28java.lang.String%2Cjava.util.Properties%2Cjava.lang.ClassLoader%29 – LearnJava

+0

@LearnJava:您可能正在尋找'com.mysql.jdbc.ConnectionImpl':https:// github.com/mysql/mysql-connector-j/blob/release/5.1/src/com/mysql/jdbc/ConnectionImpl.java – NPE

1

getConnection和createStatement是factory methods。請注意,接口是在返回的對象類中實現的。

1

只有像DriverManagerConnection,Statement等接口在JDK中聲明,實現它們的具體類在您使用的相應JDBC驅動程序中。例如,在你的情況下,你的類路徑中添加了jdbc驅動程序mysql。因此,驅動程序jar中的這些具體實現知道如何連接到數據庫並與之通話。 JDK剛剛以接口的形式定義了所有供應商類應實現的規範。這使java代碼獨立於數據庫和相應驅動程序的任何更改。

+0

我已更新完整的代碼,但無法從表中獲取記錄。它只返回「Records:[email protected]」而不是表記錄。爲什麼如此......? – LearnJava

+1

您需要遍歷ResultSet來獲取每條記錄。 –

相關問題