我创建了一个与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(host,username,password)向对象返回一个引用(类型为Connection),但在类DriverManager中没有实现任何接口。任何人都可以清除我的怀疑..?或者我错过了什么?
同样的事情是我无法使用下面的代码片段
Statement SQL = Con.createStatement();
Con.createStatement()应返回对实现Statement接口的对象的引用。但是这个Connection接口是由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 :(得分: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(...);
}
}
希望这可以解决问题。
答案 1 :(得分:1)
getConnection和createStatement是factory methods。请注意,该接口是在返回的对象类中实现的。
答案 2 :(得分:1)
只有DriverManager
,Connection
,Statement
等接口在JDK中声明,实现它们的具体类存在于您使用的相应JDBC驱动程序中。例如,在您的情况下,在您的类路径中添加了mysql
jdbc驱动程序。因此,驱动程序jar中的这些具体实现知道如何连接到数据库并与之通信。 JDK刚刚以所有供应商类应实现的接口形式定义了规范。这使得java代码独立于数据库和相应驱动程序中的任何更改。