Установление связи с базой данных с использованием JDBC

Содержание

1 Введение
2 Интерфейсы Connection и DatabaseMetaData и класс DriverManager
3 Java Data Objects

Введение

JDBC является библиотекой Java 2 Standard Edition (J2SE), используемой для взаимодействия с базами данных SQL. Для изучения данной статьи вам потребуется доступ к базе данных. Если у вас не установлены базы данных, можно воспользоваться базой данных MYSQL, бесплатной БД, которую можно скачать на сайте www.mysql.org. Она работает во многих операционных средах.

Кроме работающей БД, вам также потребуется JDBC-драйвер. И хотя JDBC может работать почти со всеми базами данных, вам потребуется отдельный драйвер, предназначенный именно для вашей базы данных. Драйвера могут быть различными, некоторые из них могут работать даже с несколькими базами данных. Скачать их можно, воспользовавшись ссылкой JDBC Technology - Drivers.

Драйвер отображает JDBC-команды на используемую вами базу данных. Для MySQL драйвер можно найти на сайтах Sourceforge.net и MySQL.org.

Для работы с JDBC-библиотеками вам необходимо запустить сервер БД и JDBC-драйвер. Как и при работе с любыми классами, необходимо сделать классы JDBC-драйвера доступными для компилятора и рабочего окружения. Сконфигурируйте переменную окружения CLASPATH или скопируйте соответствующий JAR-файл со всеми его классами в директорию $JAVA_HOME/jre/lib/ext, расположенную в основной инсталляционной директории Java 2 Platform (J2SE).

Установив настройки окружения для базы данных и драйвера, можно приступать к написанию программного кода. На начальном этапе работы с JDBC рассматривается решение двух задач:

Шаг 1: Загрузите необходимый JDBC драйвер. Заметьте, что сделать классы доступными для рабочего окружения недостаточно.

Шаг 2: Установите соединение с базой данных. Соединение включает в себя указание на определенный источник данных. От этого источника зависит выбор необходимого драйвера.

Далее представлены способы, позволяющие осуществить выполнение этих шагов.

Шаг 1: Загрузка JDBC-драйвера

При поверхностном рассмотрении JDBC-драйверы можно считать классами. Они должны реализовывать интерфейс java.sql.Driver, однако разработчикам редко требуется использовать этот интерфейс напрямую. Единственным требованием к реализации драйвера является то, что при загрузке класс должен самостоятельно регистрироваться при помощи java.sql.DriverManager. Выполнение данного требования находится под ответственностью поставщика драйвера, но ни в коем случае не пользователя. Вам необходимо только загрузить класс, причем сделать это можно тремя различными способами:

Первый возможный способ загрузки JDBC-драйвера:

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

Например, если в пути для доступа к SQL прописано mysql-2.0.13-bin.jar, вам потребуется создать экземпляр класса org.gjt.mm.mysql.Driver:

Driver d = new org.gjt.mm.mysql.Driver();

Данный метод хорошо работает для загрузки драйвера, однако у него есть свои недостатки. Хотя JDBC агностируем базой данных, пользователю вашего приложения придется использовать MySQL. Если пользователь предпочитает Oracle или Sybase, то для запуска программы нужно обязательно иметь MySQL.

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

Второй возможный способ загрузки JDBC-драйвера:

Можно избежать создания двух экземпляров драйвера путем передачи в строке методу forName класса Class имени класса. Данное имя класса должно быть полностью пригодным (например, в случае с MySQL-драйвером им может быть org.gjt.mm.mysql.Driver) и задаваться в кавычках:

Class.forName("org.gjt.mm.mysql.Driver");

В обоих из этих случаев жестко задается имя драйвера базы данных, однако предпочтительнее использовать второй способ. Так как драйвер динамически загружается во время рабочего цикла, то при компиляции классам драйвера вовсе не обязательно быть доступными. При этом вам не требуется жестко задавать строку. Все что вы можете сделать – это извлечь имя драйвера из командной строки (или откуда-либо еще) и передать его. Таким образом, ваша программа будет работать и с MySQL, и с любым другим сервером БД, не требуя при этом никаких изменений или перекомпиляций кода.

String driver = args[0];
Class.forName
(driver);

Третий способ загрузки JDBC-драйвера:

В первых двух предлагаемых нами методах вам требовалось передать откуда-либо имена драйверов. Существует и третий способ загрузки драйвера, не требующий написания никакого исходного кода. Укажите драйвер или набор драйверов, установив системное свойство jdbc.drivers, как показано ниже:

java -Djdbc.drivers=org.gjt.mm.mysql.Driver ProgName

Теперь в случае необходимости драйвер будет автоматически доступен для DriverManager. Если необходимо сделать доступными несколько драйверов, напишите их список, разделив элементы знаком «двоеточие».

Шаг 2: Установление соединения с базой данных

Источники данных идентифицируются при помощи URI-адреса, начинающегося с “jdbc:”. Продолжение строки зависит от вашего JDBC-драйвера. Каждому драйверу соответствует уникальная строка для отображения на драйвер, а также определенный механизм для локализации сервера, с которым должен будет взаимодействовать драйвер.

В случае драйвера MySQL, используется строка "mysql", а локализация задается другим URI. Полная строка будет иметь следующий формат:

jdbc:mysql://[hostname][:port]/[dbname][?param1=value1][¶m2=value2].....

Более конкретно, если хост, с которым вы хотите установить соединение, расположен на вашей же машине, именем базы данных является test и вам не требуется проверка имени пользователя и пароля, то в конечном итоге строка примет следующий вид:

jdbc:mysql://localhost/test

Если у вас есть соответствующий URI, необходимый для идентификации драйвера, и драйвер, который может установить соединение с источником данных, то возможно фактическое соединение с источником. Для подобного поиска DriverManager обеспечивает метод getConnection. Данный метод возвращает объект Connection от первого драйвера, поддерживающего специальный протокол (в данном случае mysql). Если протокол не поддерживается ни одним зарегистрированным драйвером, то во время рабочего цикла возникнет ошибка.

String uri = "jdbc:mysql://localhost/test";
Connection con =
   DriverManager.getConnection
(uri, username, password);

Имя субпротокола (в данном случае mysql) определено в документации для JDBC-драйвера.

После установки соединения доступ к источнику данных становится открытым. Тем не менее, существует и второй способ, позволяющий идентифицировать и устанавливать соединение с источником данных. Источники данных могут быть получены посредством именной службы JNDI (Java Naming and Directory Interface).

Устанавливая соединение при помощи интерфейса JNDI, вместо DriverManager используется DriverSource и Context. Конкретнее, в случае MySQL реализацией javax.sql.DriverSource является класс org.gjt.mm.mysql.jdbc2.optional.MysqlDataSource, который обычно регистрируется вне области действия приложения. Вашему приложению остается только найти источник данных, основываясь на имени, привязанному к контексту.

Context ctx = new InitialContext();
ctx.addToEnvironment
(Context.INITIAL_CONTEXT_FACTORY,
  
"com.sun.jndi.fscontext.RefFSContextFactory");
DataSource ds =
(DataSource)ctx.lookup("/tmp/jdbc/test");
Connection con = ds.getConnection
(username, password);

Установив соединение, вы получаете доступ к базе данных, так же, как и при поиске DriverManager. Поиск DriverManager обычно производится в контексте приложения J2EE.

О наличие доступа к JNDI окружению станет известно, так как обычно оно не настроено только на поиск JDBC-источника.

Проверить оба способа соединения с базой данных можно при помощи специального тестового комплекта MySQL. Вы сможете найти в нем контрольные примеры JNDIDataSource и выражения. Для других баз данных также существуют подобные комплекты, однако вы можете воспользоваться и этим. Вам потребуется лишь произвести незначительные настройки, указав источник данных и драйвер, соответствующий данной БД.

Проверить полученные знания можно при помощи он-лайн теста.

Интерфейсы Connection и DatabaseMetaData и класс DriverManager

JDBC обеспечивает программный интерфейс API, позволяющий при помощи языка программирования Java получать доступ к данным, хранимым в таких источниках, как реляционная база данных, а также обрабатывать их. API включает в себя пакет java.sql, называемый основным API для JDBC, а также пакет javax.sql, являющийся необязательным API для JDBC (он включен в поставку J2SE версии 1.4).

Описываемые здесь интерфейсы и класс можно найти в пакете java.sql.

Интерфейс Connection представляет сессию соединения с базой данных, обеспечиваемую драйвером. Он также обеспечивает методы для создания выражений, управления соединениями и их свойствами. Метод ConnectiongetMetaData:

public DatabaseMetaData getMetaData()

бросает исключение SQLException.

Класс DriverManager является классом утилиты, управляющим JDBC-драйверами. Он содержит список зарегистрированных в системе JDBC-драйверов и устанавливает соединение с драйвером. Данный класс используется в основном для получения ссылки на объект Connection посредством метода getConnection:

  • getConnection(String url) Пытается установить соединение с URL-адресом заданной базы данных.

  • getConnection(String url, Properties info) Пытается установить соединение с URL-адресом заданной базы данных. Параметры: url – адрес в формате jdbc:subprotocol:subname, info – список произвольных пар тег/значение типа String, передаваемых в качестве аргументов соединения. Обычно должна быть включена хотя бы одна пара «имя пользователя»/«пароль».

  • getConnection(String url, String user, String password) Пытается установить соединение с URL-адресом заданной базы данных. Параметры: url – адрес в формате jdbc:subprotocol:subname, user – пользователь базы данных, от имени которого устанавливается соединение, password – пароль пользователя.

Интерфейс DatabaseMetaData обеспечивает информацию о самой базе данных. Некоторые методы в этом интерфейсе принимают форму строк. Метод, извлекающий информацию о свойстве, не поддерживаемом драйвером, бросает исключение SQLException.

Вот несколько методов данного интерфейса:

  • getDriverName Извлекает имя текущего JDBC-драйвера.

  • getDriverVersion Извлекает значение версии JDBC-драйвера в виде строки.

  • getDatabaseProductVersion Извлекает значение версии текущего продукта БД.

Программные задачи
  • Создайте программу, устанавливающую соединение с вашей базой данных

  • Отобразите информацию о базе данных и о драйвере, используемом для установки соединения

Методы для получения доступа к информации о базе данных доступны посредством интерфейса DatabaseMetaData, ассоциированного с соединением.

Возможное решение задачи.

Java Data Objects

JDO (Java Data Objects – объекты данных Java) является программным интерфейсом API, позволяющим устанавливать «прозрачный» доступ к базе данных. Программист может написать код на языке Java, организующий «прозрачный» доступ к основному хранилищу данных, не привлекая для этой цели специальный код БД.

Интерфейсы JDO и JDBC дополняют друг друга. У каждой из данных технологий есть свои преимущества, обе они могут использоваться программистами различной квалификации для широкого диапазона задач.

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

JDO обеспечивает программистам дополнительные удобства, а также контроль типов во время компиляции. Кроме того, JDO скрывает от программистов SQL, так что его изучение становится необязательным.

API JDO создается в Java Community Process.

Теги: database jdbc