2012-07-22 3 views
4

Я использую интерфейсное соединение из пакета java.sqlГде реализуется интерфейс java.sql.Connection?

На самом деле я, хотя это класс, но когда я попытался посмотреть исходный код, я понял, что это интерфейс.

В источнике интерфейса Connection есть только одна строка для каждого метода без какой-либо реализации!

Что делает этот интерфейс таким?

базы данных для подключения к: MySql

кодовой страницы источника подключения: http://www.docjar.com/html/api/java/sql/Connection.java.html

+0

С какой базой данных вы пытаетесь соединиться? –

+0

@drumboog: Я пытаюсь подключиться к MySql – malhobayyeb

ответ

9

Это не интерфейс, который «работает», а один из его реализаций, характерный для вашего конкретного поставщика RDBMS. Фактически, обычно поставщик предоставляет реализацию интерфейса Connection.

Когда вы звоните

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

менеджера водителя поиск через зарегистрированные драйвера JDBC, находит один для MySQL (он знает, что это MySQL из строки подключения), передает свойство соединения конструктора класса внутри MySQL JDBC который реализует Connection и возвращает возвращаемый экземпляр Connection. Например, драйвер может возвращать экземпляр класса private-класса MySqlConnection, который реализует Connection, и ваша программа будет использовать его для взаимодействия с РСУБД без каких-либо сведений о классе, кроме того, что он реализует Connection.

+1

DriverManager не знает, что является драйвером MySQL, он просто запрашивает каждый зарегистрированный Драйвер и спрашивает, примет ли этот драйвер URL-адрес (используя 'acceptsURL'), первый, чтобы вернуть true в этом запросе, будет предложено создать соединение , –

+0

@MarkRotteveel Правильно, вот как он «знает» это драйвер MySQL. Я пропустил детали процесса проб и ошибок, с помощью которых менеджер драйверов приходит к конкретной реализации драйвера как сложная деталь, которая не является существенной для понимания OP проблемы. – dasblinkenlight

2

Драйвер MySQL (http://www.mysql.com/products/connector/) содержит фактическую реализацию. Интерфейс java.sql.Connection просто определяет методы, которые ожидает стандарт JDBC. Каждый драйвер базы данных должен определить, как реально подключиться.

+0

Но я использую Connection для создания своих объектов? Как компилятор знает, что это не пустой интерфейс, а реализованный драйвер? – malhobayyeb

+0

Как вы создаете соединение? DriverManager?Из Интернета (ресурс JNDI)? Проинформировать его напрямую? ДрайверManager использует URL-адрес для определения типа создаваемого объекта Connection. Используя ресурсы JNDI в веб-контейнере, вы должны настроить сервер, чтобы сообщить ему фактический тип, который должен использоваться. Если вы создаете его прямо, тогда вы просто скажете «Connection conn = new MySQLConnection()» (не уверены, правильно ли это имя класса). Один из первых двух вариантов - лучший. –

1

Вот некоторые примеры классов, которые прямо или косвенно реализуют интерфейс java.sql.Connection:

  • oracle.jdbc. OracleConnectionWrapper
  • com.mysql.jdbc. ConnectionImpl
  • com.microsoft. sqlserver.jdbc. SQLServerConnection

В пространстве имен пакетов вы можете указать, из какого драйвера jdbc они есть. Но эти и другие классы реализации не должны использоваться напрямую. Как указано в dasblinkenlight, вы должны программировать против API JDBC, а не классов, предоставляемых в каждой библиотеке драйверов JDBC. Использование API позволит вам переключать RDBMS и не нарушать ваш код доступа к данным java.

Интересно, что в наши дни все меньше и меньше людей используют API JDBC. Многие люди используют объектно-реляционную структуру отображения, которая построена поверх JDBC, например Hibernate.

Смежные вопросы