java.sql.Connection接口的实现在哪里?

java.sql.Connection接口的实现在哪里?,java,jdbc,Java,Jdbc,我正在使用java.sql包中的接口连接 实际上,我认为它是一个类,但当我试图查看源代码时,我发现它是一个接口 在连接接口的源代码中,每个方法只有一行,没有任何实现 是什么让这个界面像它一样工作 要连接到的数据库:MySql 连接源代码页: MySQL驱动程序()包含实际的实现。连接接口只定义JDBC标准所期望的方法。每个数据库驱动程序都必须定义实际连接的方式。不是“工作”的接口,而是其实现之一,这是特定于特定RDBMS供应商的。事实上,通常是供应商提供连接接口的实现 当你打电话的时候 Conn

我正在使用java.sql包中的接口连接

实际上,我认为它是一个类,但当我试图查看源代码时,我发现它是一个接口

在连接接口的源代码中,每个方法只有一行,没有任何实现

是什么让这个界面像它一样工作

要连接到的数据库:MySql

连接源代码页:

MySQL驱动程序()包含实际的实现。连接接口只定义JDBC标准所期望的方法。每个数据库驱动程序都必须定义实际连接的方式。

不是“工作”的接口,而是其实现之一,这是特定于特定RDBMS供应商的。事实上,通常是供应商提供
连接
接口的实现

当你打电话的时候

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

驱动程序管理器搜索注册的JDBC驱动程序,找到MySQL的驱动程序(它从连接字符串中知道它是MySQL),将连接属性传递给MySQL JDBC驱动程序中实现连接的类的构造函数,并将结果连接返回给您。例如,驱动程序可能返回一个包私有类
MySqlConnection
的实例,该类实现了
Connection
,您的程序将使用它与RDBMS进行交互,而不知道该类的任何细节,除了实现
连接

之外,以下是一些直接或间接实现java.sql.Connection接口的类的示例:

  • oracle.jdbc。
OracleConnection
包装纸
  • com.mysql.jdbc。
连接模式
  • com.microsoft。
sqlserver.jdbc。
SQLServerConnection
通过包名称空间,您可以知道它们来自哪个jdbc驱动程序。 但是这些类和其他实现类不能直接使用。正如dasblinkenlight所指出的,您应该针对JDBCAPI编程,而不是针对每个JDBC驱动程序库中提供的类。使用API将允许您切换RDBMS,而不会破坏java数据访问代码


有趣的是,现在越来越少的人使用JDBCAPI。许多人使用构建在JDBC之上的对象关系映射框架,如Hibernate

您试图连接到哪种类型的数据库?@Drumbog:我正在尝试连接到MySQL,但我正在使用连接创建我的对象?编译器如何知道这不是空接口而是实现的驱动程序?您如何创建连接?司机经理?来自web(JNDI资源)?直接实例化它?DriverManager使用url确定要创建的连接对象类型。使用web容器中的JNDI资源,您必须配置服务器,以告诉它应该使用的实际类型。如果您直接实例化它,那么只需说
Connection conn=new MySQLConnection()
(不确定该类名是否正确)。前两个选项中的一个是最好的。DriverManager不知道哪个是MySQL驱动程序,它只需查询每个注册的驱动程序并询问该驱动程序是否接受URL(使用
acceptsURL
),第一个在该查询中返回true的将被要求创建连接。@markrotVeel Right,这就是它“知道”的方式这是MySQL驱动程序。我跳过了试验和错误过程的细节,驱动程序管理器通过该过程得出驱动程序的特定实现,这是一个复杂的细节,对于OP对问题的理解并不重要。