Любое современное приложение работает с разного рода данными. Получает их, обрабатывает, анализирует, хранит. Сами же эти данные тоже должны где-то хранится. Так вот, данные хранятся в специальных базах данных, управляемых разного рода СУБД (Системами Управления Базами Данных), а JDBC (Java DataBase Connectivity) – Java API для взаимодействия с СУБД. Из некоторых важных характеристик JDBC API стоит отметить, то что он абстрактный (абстрагирует разработчика от нюансов конкретной СУДБ). При этом сам разработчик может использовать специфические детали СУБД.
Как JDBC взаимодействует с базой данных?
После прочтения первого абзаца этот вопрос возникает естественным образом. Действительно, как? Ведь существует огромное количество баз данных (Oracle, PostgreSQL, MySQL и т.д. ), каждая из которых имеет свое собственное API, даже разные синтаксисы SQL! Для взаимодействия с базой данных необходимо использовать JDBC Driver, который предоставляется разработчиками самой базы данных. Т.е. при работе с Oracle, необходимо использовать драйвер предоставляемый Oracle. Конечно, это необязательно. Никто не запрещает вам сделать свой собственный JDBC Driver с Блэк-джэком и … ну вы поняли 🙂 Этот подход описывает один из паттернов “Банды 4-х” – Bridge. Будучи разработчиком вы врятли будите его часто использовать.
Как вы можете видеть JDBC Driver реализует нативный протокол, по которому происходит обращение к серверу базы данных. Причем мы работает с интерфейсом JDBC. Который уже работает с драйвером. Как раз это позволяет нам, быть устойчивыми к изменению СУБД. Поменять Oracle на PostgreSQL? Легко! Меняем только драйвер, реализацию не трогаем. Так же может быть ситуация, когда нам необходимо использовать несколько драйверов. Поэтому в JVM есть возможность централизовано хранить их. Для этого необходимо создать объект класса DriverManager( по сути Singletone) и зарегистрировать драйвера в менеджере.
DriverManager
Работа протекает таким образом, что разработчику обращается к драйверу с помощью метода getConnection() в параметрах которого передает “свойства” базы данных(DB_URL). Ниже подробнее рассмотрим этот метод. Далее DriverManager предоставляет экземпляр драйвера, который соответствует переданным свойствам. Отмети, что если в менеджере находится несколько одинаковых драйверов, то возвращен будет только первый соотвествующий входным параметрам getConnection(). Для того, чтобы использовать DriverManager, необходимо зарегистрировать в нем ваши драйвера (только если вы работаете с JDBC 4, это произойдет автоматически). Для этого вам предоставляется на выбор несколько вариантов:
- Загрузить класс драйвера с помощью Reflection Class.forName(MyDriver.class)
- Использовать свойство JVM
- Либо вызвать метод DriverManager.regiterDriver(new MyDriver())
Установка соединения с базой данных
Когда же мы, наконец установили драйвер, зарегистрировали его в DriverManager, мы устанавливаем соединение с базой данных. Как написано выше, для получения соединения нам необходимо вызвать у менеджера метод getConnection(). Метод реализован в трех вариантах.
1 2 3 |
DriverManager.getConnection(String DBURL) DriverManager.getConnection(String DBURL, Properties props) DriverManager.getConnection(String DBURL, String user, String password) |
DBURL – однозначно идентифицирует источник данных. Для разных баз данных имеет свой формат
1 2 |
jdbc:oracle:thin:@dbhost:1488:EXAMPLE //Oracle jdbc:msql://db_host:2228/db_test //MySQL |
props – свойства типичные для СУБД в формате пары “ключ-значение”
user, password – имя пользователя базы данных и пароль.
Так же после выполнения всех необходимых операций необходимо вызвать метод close(), чтобы закрыть соединение с базой данных. Хотя так говорить неправильно, исходя из представленной нами архитектуры. Метод close() вернет соединение обратно в DriverManager.
Исходя из вышесказанного приведем пример кода:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import java.sql.*; public static void main(String[] args){ try{ Class.forName(“com.pointbase.jdbc.jdbcUniversalDriver”); Connection connection = DriverManager.getConnection(“jdbc:pointbase:server://127.0.0.1:9092/HRDB”, “admin”, “admin”); //Бизнес-логика omitted connection.close(); }catch(Exception e){ e.printStackTrace(); } } |
Типы JDBC драйверов
Всего существует 4 типа JDBC-драйверов.
JDBC-ODBC – класс этого драйвера включен в JRE. Его недостатком является то, что он может работать только из под Windows.
JDBC-Native – в отличии от ODBC может использоваться на любой операционной системе. Naitve-драйвер предоставляется разработчиками БД. Для использования его необходимо сконфигурировать под выбранную ОС, из-за этого возникают проблемы с переносимостью.
JDBC-Net – реализует трехуровневую систему доступа к БД как можно видеть из рисунка.
Pure Java-driver – полностью написан на Java, за счет этого требуется гораздо меньше затрат в случае переносимости.
Резюме
В настоящее время глубокое знание JDBC не часто требуется работодателями. Популярными решения на базе JDBC являются ORM решения, такие как Hibernate. Однако, например, в проектах, связанных с миграцией большого количества данных из разнородных источников, ORM-решения будут бессильны. В общем, ORM- более высокий уровень абстракции по сравнению с JDBC.