JDBC-接口的实现

时间:2012-04-26 17:08:09

标签: java jdbc

在JDBC中,为了在DB中连接和执行语句,我们主要使用Connection,Statement和ResultSet作为接口。但是它们的相应对象后来用于运行createStatement(),executeQuery(),next()等方法。这些类实现了这些方法吗? 为什么将它作为连接对象而不是实现的类对象调用?

5 个答案:

答案 0 :(得分:2)

你实际上并没有

Connection conn = new Connection();

您可以执行类似

的操作
Connection conn = DriverManager.getConnection(
     DB_PATH + "?user=" + USER_NAME + "&password=" + USER_PASS); 
Statement statement = conn.createStatement();
ResultSet resultSet = statement.executeQuery(query);

但要直接回答你的问题否你无法实例化Interface你必须使用implements Interface或使用代理的类。

答案 1 :(得分:2)

在JDBC中,首先通过调用

来注册驱动程序
Class.forName('classname')

加载Database类并使用DriverManager

注册该类

当你说DriverManager.getConnection(时 - 它会返回java.sql.Connection(按规格签订的合同)

  

哪个类实现了这些方法?

实际的实现由数据库供应商提供,例如, Oracle,MySQL。

  

为什么将其称为连接对象而不是已实现的类   对象

因为你code to Interface and not implementation(良好的编码习惯)。

如果您需要,可以在供应商jar中查找并找到哪个类实现Connection,而不是

Connection connection = DriverManager.getConnection()

你可以写

VendorConnectionImpl vendorConnection = (VendorConnectionImpl)DriverManager.getConnection()

以上内容可行但后来会将您与特定实现绑定。

如果你想从vendor1转到vendor2,你不能这样做,首先你必须按照vendor2 API改变上面的代码,但是如果你使用第一种方法,你可以从供应商转移到供应商而不必改变你的代码。

答案 2 :(得分:0)

您无法实例化接口类。您可以自己实现该界面,也可以使用Proxy创建所述接口的实例,该实例将所有调用委托给提供的InvocationHandler

答案 3 :(得分:0)

这些人正在回答你的问题,但我不认为你是从评论中得到的。

您需要通过创建自己的类来实际实现接口。因此,创建一个实现接口的类,包含正确的抽象方法,然后在新类中添加您想要的功能。然后你将实例化该类以使用这些函数。

接口就像一个编程“契约”,它确保扩展接口的任何类都能实现某些功能,但是,你不能实例化接口本身来使用它的'方法,你继承它们/覆盖它们他们在你的新课堂上。在覆盖新类中的抽象方法之后,您可以编写任何您希望特定接口扩展类执行的操作。

http://www.javabeginner.com/learn-java/java-abstract-class-and-interfacehttp://www.javaworld.com/javaworld/javaqa/2001-04/03-qa-0420-abstract.html 将让您阅读这些主题。

答案 4 :(得分:0)

希望以下说明会有所帮助。

问:驱动程序连接实现来自哪里?以及Statement和ResultSet的实现?

Class.forName("com.mysql.jdbc.Driver").newInstance();
// String url="jdbc:mysql://localhost:3306/mydb?user=root&password=root";
Connection con = DriverManager.getConnection(url);

小技巧:一旦加载(初始化)DriverManager类,就加载驱动程序实现。

以mysql-connector-java:5.1.36的源代码为例。

●类 com.mysql.jdbc.Driver 扩展了类 NonRegisteringDriver ,其中有一个名为 connect()的方法,该方法返回一个Connection的实例。
请注意NonRegisteringDriver的 registeredDrivers 字段

public class Driver extends NonRegisteringDriver implements java.sql.Driver {
...
public java.sql.Connection connect(String url, Properties info) throws SQLException {

●已注册mysql驱动程序,并将该驱动程序添加到 registeredDrivers

Class.forName("com.mysql.jdbc.Driver");
...
java.sql.DriverManager.registerDriver(new Driver()); // from com.mysql.jdbc.Driver
...
registeredDrivers.addIfAbsent(new DriverInfo(driver, da));  // mysql driver instance is added to registeredDrivers

从现在起 JDBC 知道存在一个JDBC实现,即mysql。
●然后创建连接:

Connection con = DriverManager.getConnection(url);

●遵循 DriverManager.getConnection
的源代码 注意 registeredDrivers
此处连接实现 aDriver.driver.connect

创建
for(DriverInfo aDriver : registeredDrivers) {
...
     Connection con = aDriver.driver.connect(url, info);
...
}

●由于已找到mysql的连接实现,因此还可以通过挖掘mysql-connector-java的源代码来找到 Statement ResultSet 的实现: 5.1.36

Statement stmt = con.createStatement();
// String sql = "select * from user";
ResultSet rs=stmt.executeQuery(sql);

对于 JDBC 4 ,将在加载类DriverManager时从类路径中自动检测驱动程序实现:
DriverManager.java#l101

static {
    loadInitialDrivers();
    println("JDBC DriverManager initialized");
}

...

private static void loadInitialDrivers() {
...
    ServiceLoader<Driver> loadedDrivers = ServiceLoader.load(Driver.class);
...
}

文件mysql-connector-java-5.1.36.jar!/ META-INF / services / java.sql.Driver 的内容:

com.mysql.jdbc.Driver
com.mysql.fabric.jdbc.FabricMySQLDriver