Статьи

Азбука JDBC, часть 1 — Начало работы с JDBC

API Java Database Connectivity (JDBC) остается отраслевым стандартом для независимой от базы данных связи между Java и широким спектром баз данных. В то время как современные объектно-реляционные структуры, такие как Hibernate и JPA, упрощают сохранение данных, знание API JDBC по-прежнему является важной частью инструментария любого разработчика Java.

DZone собрал группу экспертов JDBC из сообщества, которые будут отвечать на некоторые из ваших наиболее распространенных (и не очень распространенных) вопросов об API JDBC. В течение следующих нескольких месяцев мы будем публиковать их ответы здесь на JavaLobby. Мы рекомендуем вам поделиться своим мнением и опытом, используя JDBC!

На этой неделе Даниэль Рубио, автор Web Forefront , дает ответы на некоторые распространенные (но важные) вопросы JDBC.

Прочитайте другие части в серии часто задаваемых вопросов JDBC DZone :

 

Что такое JDBC?

Даниэль Рубио: JDBC API — это стандарт, который позволяет приложениям Java выполнять операции с постоянными источниками хранения, в том числе с системами управления реляционными базами данных (RDBMS), электронными таблицами, плоскими файлами и другими табличными источниками данных.

Поскольку JDBC API поддерживается несколькими решениями постоянного хранения, это позволяет разработчикам Java изучать и концентрироваться на одном API, не беспокоясь о возможных расхождениях при выполнении операций с различными решениями постоянного хранения.

JDBC API является частью стандартной версии Java.

 

Что такое драйвер JDBC?                                                           

Даниэль: Драйвер JDBC — это то, что позволяет постоянному хранилищу поддерживать операции через JDBC API. Каждое решение для постоянного хранения обычно поставляется с драйвером JDBC. Хотя можно написать драйвер JDBC с нуля, создание драйвера JDBC требует глубокого понимания лежащего в основе решения для постоянного хранения, поэтому лучше всего использовать предварительно встроенный драйвер JDBC.

 

Как работает Java Database Connectivity (JDBC)?

Даниэль: JDBC отображает операции решения для постоянного хранения в едином API (то есть в JDBC API). Поскольку каждое решение для постоянного хранения данных будет иметь собственный способ создания, чтения, обновления и удаления данных, JDBC сопоставляет каждый из этих частных вызовов с одним вызовом JDBC API, который выполняется единообразно независимо от производителя постоянного хранилища.

Вы можете думать об этом с точки зрения пересечения моста, когда один конец представляет приложение Java, а другой — решение для постоянного хранения. Чтобы пересечь первую половину моста, вы должны изучить API JDBC и включить его в приложение Java. Пересекая вторую половину моста, вы должны полагаться на драйвер JDBC, предназначенный для конкретного решения для постоянного хранения. Преимущество состоит в том, что, узнав JDBC API, вы всегда на полпути к общению с любым
решением для постоянного хранения, поддерживающим JDBC.

 

Если я использую JDBC API, должен ли я использовать ODBC?

Даниэль: Есть только одно обстоятельство, при котором JDBC будет использоваться вместе с ODBC: отсутствие подходящего драйвера JDBC для решения для постоянного хранения. При таких обстоятельствах драйвер ODBC решения для постоянного хранения данных используется в качестве основного механизма для выполнения операций через JDBC API.

Однако следует отметить, что этот подход, часто называемый мостом JDBC-ODBC, потерял популярность из-за растущего присутствия драйверов JDBC, предоставляемых производителями. Что касается самого API ODBC, то нет необходимости использовать этот API при использовании API JDBC.

 

Как только у меня будет Java Standard Edition, что еще мне нужно для подключения к базе данных?

Даниэль: В дополнение к Java SE, который включает в себя JDBC API, вам также необходимо получить следующее:

  •  Драйвер JDBC (т.е. файл JAR) для конкретной версии базы данных и производителя, к которому вы хотите подключиться,
  •  Учетные данные подключения к системе постоянного хранения (например, имя пользователя, пароль, URL-адрес местоположения) — это предоставляется вашим системным администратором или администратором базы данных.

 

Какие шаги необходимы для выполнения запроса в JDBC?

  • Установите соединение с системой постоянного хранения
  • Выполните требуемый запрос, используя JDBC API
  • Проверяйте и используйте результаты, полученные при использовании API JDBC

 

Как мне создать соединение с базой данных?

Даниэль: Соединение с базой данных осуществляется посредством комбинации классов JDBC API, включая параметры конфигурации, специфичные для базы данных. Существует два способа создания соединения с базой данных: один включает класс DriverManager, а другой — класс DataSource. Обратите внимание, что оба класса принадлежат JDBC API.

Класс DriverManager представляет собой самый ранний подход к созданию соединения с базой данных. Следующий фрагмент кода, иллюстрирующий этот процесс.

Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "foo", "bar");
Statement stmt = con.createStatement();

 

 

 Чтобы создать соединение с помощью класса DriverManager, вам нужно вызвать метод getConnection (). В этом случае метод getConnection () получает три параметра: строку, указывающую URL-адрес соединения с базой данных — в форме «jdbc: <тип_базы_данных>: // <хост>: <порт> / <имя>» — и две дополнительные строки, определяющие имя пользователя и пароль базы данных. Кроме того, перед созданием соединения с использованием класса DriverManager, вызывается Class.forName, чтобы убедиться, что соответствующий класс драйвера JDBC загружен в путь к классам Java. После создания объекта Connection его можно использовать для выполнения запросов к базе данных.

Другой вариант создания соединения с базой данных состоит в использовании класса DataSource. Класс DataSource в первую очередь предназначен для использования в приложениях Java EE и представляет собой более новый подход к использованию класса DriverManager. Учитывая потребности приложений Java EE, класс DataSource повышает переносимость кода, а также производительность при использовании JDBC API.

Например, в следующем фрагменте кода показано, как создать соединение с базой данных с помощью класса DataSource.

InitialContext cxt = new InitialContext();
DataSource ds = (DataSource) cxt.lookup("java:/comp/env/jdbc/mysql");
Connection conn = ds.getConnection();
Statement stmt = conn.createStatement();

 

Подобно классу DriverManager, класс DataSource также вызывает метод getConnection () для создания соединения. Однако, в отличие от своего аналога, обратите внимание, что объект DataSource не имеет так много жестко закодированных параметров соединения, а скорее создается с помощью строки:

ctx.lookup("java:/comp/env/jdbc/mysql"); 

 

Эта последняя строка представляет ресурс JNDI.  

Ресурсы JNDI распространены в приложениях Java EE, поскольку они позволяют конфигурировать ресурсы в центральном месте вместо жесткого их кодирования в коде Java. В этом случае для ресурса JNDI настроены те же параметры подключения к базе данных (т. Е. «Jdbc: mysql: // localhost: 3306 / test», «foo», «bar»), за исключением того, что это сделано в централизованном файле конфигурации. Обсуждение конфигурации ресурсов JNDI выходит за рамки этого вопроса, обратитесь к документации вашего веб-контейнера Java EE для получения дополнительной информации о конфигурации ресурсов JNDI.   

Другой вариант использования класса DataSource состоит в том, что он отказывается от использования JNDI и вместо этого полагается на внедрение зависимостей — распространенный процесс в приложениях Java, использующих такие среды, как Spring или Guice. Следующий фрагмент кода иллюстрирует эту последовательность.

private DataSource ds = null;
public void setDataSource(DataSource ds) {
this.ds = ds;
}

Connection conn = ds.getConnection();
Statement stmt = conn.createStatement();

   

В этом случае обратите внимание, что объект DataSource явно не имеет каких-либо параметров конфигурации, однако это не так. Когда приложение, использующее этот конкретный фрагмент кода, использует инфраструктуру внедрения зависимостей, объект считается внедренным со своими значениями. Аналогично использованию JNDI параметры подключения к базе данных DataSource (например, «jdbc: mysql: // localhost: 3306 / test», «foo», «bar») настраиваются в централизованном файле конфигурации. Обсуждение конфигурации внедрения зависимостей выходит за рамки этого вопроса, обратитесь к документации вашей инфраструктуры внедрения зависимостей для получения дополнительной информации о конфигурации внедрения DataSource.

Наконец, еще одно преимущество использования класса DataSource над классом ConnectionManager заключается в том, что класс DataSource тесно связан с использованием пулов соединений. Пулы соединений описаны далее.

 

Что такое соединение?                                                           

Даниэль: Соединение — это объект, способный выполнять операции CRUD (например, создавать, читать, обновлять, удалять) в системе постоянного хранения.

 

Что такое пул соединений?                                                           

Даниэль: Пул соединений — это повторное использование объектов соединений, используемых для доступа к системам постоянного хранения. Поскольку создание объектов соединения требует времени и ресурсов (например, установления соединения через сеть), поддержание объектов соединения в режиме ожидания может повысить производительность приложений, использующих JDBC API.

Управление пулами подключений, которые могут включать предварительное создание объектов подключений или ограничение количества объектов подключений в пуле, обычно делегируется сторонним библиотекам. Одной из самых популярных библиотек пула является DBCP Apache (http://commons.apache.org/dbcp/). Следует также отметить, что если приложение предназначено для работы в веб-контейнере Java EE (например, Tomcat), пул соединений является рекомендуемым подходом.

 

Что такое DriverManager?

Даниэль: DriverManager — это класс, который позволяет устанавливать соединение с системой постоянного хранения с использованием JDBC. См. «Как создать соединение с базой данных» для более подробной информации о DriverManager.

 

Что такое пул выписок?                                                           

Даниэль: Подобно пулу соединений, пул операторов состоит из повторного использования объектов операторов, используемых для запросов к постоянной системе хранения. Поскольку выполнение объекта Statement требует времени и ресурсов (например, запись обновления X, запись обновления Y, запись обновления Z), хранение объектов Statement в предварительно скомпилированной форме может повысить производительность приложений, использующих JDBC API.

 

Что такое DML?                                                           

Даниэль: DML расшифровывается как Data Manipulation Language (DML) и состоит из операторов, используемых для управления данными. JDBC API поддерживает множество операций DML. Типичные операции DML включают SELECT, INSERT, UPDATE и DELETE. DML напрямую не связан с JDBC, а скорее является частью более широкого набора терминов базы данных наряду с языком определения данных (DDL), языком управления данными (DCL) и языком управления транзакциями (TCL).

 

Какие четыре типа драйверов JDBC?           

Драйверы JDBC развивались с течением времени. В настоящее время существует четыре типа драйверов JDBC и продолжается работа над пятым типом.

Драйверы JDBC типа 1 — первые драйверы JDBC. Драйверы типа 1 работают на основе ODBC, который был установлен API постоянного хранения на момент выпуска JDBC. Это позволило использовать JDBC API в приложениях, которые должны были подключаться к системам постоянного хранения через ODBC. Драйверы этого типа часто называют мостами JDBC-ODBC, учитывая их необходимость работать через ODBC.

Драйверы JDBC типа 2драйверы типа 2 преобразуют вызовы JDBC в собственные вызовы, принадлежащие API-интерфейсу постоянного производителя хранилища. По сравнению с драйверами JDBC типа 1, драйверы JDBC типа 2 представляют собой шаг вперед, поскольку они связаны непосредственно с API постоянного производителя хранилища, а не с ODBC. Это делает процесс подключения более эффективным, хотя и менее переносимым, поскольку драйвер связан с API постоянного производителя хранилища (например, версия и операционная система). 

Драйверы JDBC типа 3Драйверы типа 3 работают через протокол постоянной системы хранения, в отличие от драйверов типа 1 и типа 2, которые работают путем отображения API-интерфейсов более низкого уровня (т. Е. ODBC и native). Драйверы JDBC типа 3 требуют наличия промежуточного уровня. Затем этот промежуточный уровень выполняет функции посредника, преобразуя вызовы приложений в независимый от базы данных протокол, который затем преобразуется в протокол базы данных.

Драйверы JDBC типа 4 — Подобно драйверам JDBC типа 3, драйверы типа 4 также работают по протоколу системы постоянного хранения, за исключением того, что для их работы не требуется промежуточный уровень, что приводит к повышению производительности по сравнению с драйверами JDBC типа 3. Соединения между приложением и системой постоянного хранения могут быть сделаны напрямую (то есть обычно через сетевое соединение). Большинство современных решений для постоянного хранения данных предлагают драйверы JDBC типа 4.

Драйверы JDBC типа 5 (текущая работа). Хотя о появлении драйверов JDBC типа 5 нет официального сообщения, в Интернете имеются многочисленные публикации о некоторых недостатках драйверов JDBC типа 4. Некоторые из этих проблем включают решение таких технологий, как объектно-реляционное сопоставление (ORM), которые зависят от JDBC и в последние годы стремительно развиваются, массовая загрузка данных и развертывание «все в одном». Вы можете найти интересное прочтение о возможном будущем драйверов JDBC типа 5 от Джесси Дэвиса — активного члена экспертной группы JDBC — в  Has JDBC в соответствии с требованиями Enterprise.

 

Примечание редактора: в следующих выпусках мы рассмотрим наборы результатов JDBC, типы данных, транзакции и многое другое.