谁在这个java程序中实现了Connection,ResultSet和Statement接口?

时间:2013-06-16 18:36:32

标签: java interface

我最近发现以下程序中使用的Statement,Connection和ResultSet是接口。这个程序完全正常,但谁实现了这些接口?

package jdbc;

import java.sql.*;

public class Mango {

    public static void main(String[] args) throws Exception {
        Class.forName("oracle.jdbc.driver.OracleDriver");   
        Connection con = DriverManager.getConnection("jdbc:oracle:thin:@66.66.66.128:1521:xe","SYSTEM","matrix");
        Statement comm = con.createStatement();
        comm.executeQuery("insert into a values('a',1)");
        ResultSet res = comm.executeQuery("SELECT * FROM A");
        comm.executeQuery("insert into a values('a',1)");
        while(res.next()) {
            System.out.println(res.getString(1) + " " + res.getInt(2));
        }
    }

}

5 个答案:

答案 0 :(得分:6)

接口Statement,Connection和ResultSet最终由第三方JDBC驱动程序提供程序实现。

假设您使用的是MySQL驱动程序,这就是实现层次结构的方式,

  1. java.sql.Statement接口最终由com.mysql.jdbc.StatementImpl类实现。
  2. 内部实施层次结构:

    com.mysql.jdbc.StatementImpl(Class) -->implements--> com.mysql.jdbc.Statement(interface) -->extends--> java.sql.Statement(interface)

    1. java.sql.Connection接口最终由com.mysql.jdbc.JDBC4Connection类实现。
    2. 内部实施层次结构:

      com.mysql.jdbc.JDBC4Connection(Class) -->extends--> com.mysql.jdbc.ConnectionImp(Class) -->extends--> com.mysql.jdbc.ConnectionPropertiesImpl(Class) -->implements--> com.mysql.jdbc.MySQLConnection(Interface) -->extends--> com.mysql.jdbc.Connection(Interface) -->extends--> java.sql.Connection(Interface)

      1. java.sql.ResultSet接口最终由com.mysql.jdbc.ResultSetImpl类实现。
      2. 内部实施层次结构:

        com.mysql.jdbc.ResultSetImpl(Class) -->implements--> com.mysql.jdbc.ResultSetInternalMethods(Interface) -->extends--> java.sql.ResultSet(Interface)

答案 1 :(得分:2)

JDBC API是通过JDBC驱动程序实现的,这些驱动程序由各种数据库软件供应商提供。

JDBC驱动程序是一组实现JDBC接口以处理JDBC调用并将结果集返回给Java应用程序的类

答案 2 :(得分:1)

JDBC驱动程序提供程序提供了可以执行此操作的实现。在这种情况下,Oracle。

 System.out.println("con class is "+ con.getClass());
 System.out.println("comm class is "+ comm.getClass());
 System.out.println("res class is "+ res.getClass());

BTW不要忘记在完成资源后关闭资源,或者你可以获得记忆。

答案 3 :(得分:1)

这些类型的接口的实现是特定于供应商的。 例如,如果您使用的是Mysql并且已将Mysql Jar放在类路径中,那么实现类如下:

1. java.sql.Statement [Interface] -> com.mysql.jdbc.StatementImpl [Class]

2. java.sql.Connection [Interface] -> com.mysql.jdbc.MySQLConnection [Interface] -> com.mysql.jdbc.ConnectionImpl [Class]

3. java.sql.ResultSet [Interface] -> com.mysql.jdbc.ResultSetImpl [Class]

答案 4 :(得分:0)

数据库供应商提供第三方驱动程序,JDBC-ODBC驱动程序通过该驱动程序与数据库进行通信。 这些第三方驱动程序具有某些实现接口的类,并根据需要编写它们的主体。所以当你从mysql数据库移动到oracle数据库时,驱动程序的主体就会改变。