Типы драйверов в jdbc
Взаимодействие между приложением Java и СУБД осуществляется с помощью драйверов JDBC, обеспечивающих реализацию общих интерфейсов для конкретных СУБД и конкретных протоколов.
В JDBC определяются четыре типа драйверов:
1. Тип 1 – драйвер, использующий другой прикладной интерфейс, в частности ODBC, для работы с СУБД (так называемый JDBC—ODBC—мост). Стандартный драйвер типа 1 sun.jdbc.odbc.JdbcOdbcDriver входит в JSDK.
2. Тип 2 − драйвер, работающий через нативные библиотеки (т.е. клиента) СУБД.
3. Тип 3 – драйвер, работающий по сетевому и независимому от СУБД протоколу с промежуточным java-сервером, который в свою очередь подключается к нужной СУБД.
4. Тип 4 – сетевой драйвер, работающий напрямую с нужной СУБД и не требующий установки native-библиотек.
Предпочтение естественным образом отдается второму типу, однако если приложение выполняется на машине, на которой не предполагается установка клиента СУБД, то выбор производится между третьим и четвертым типами. Причем четвертый тип работает напрямую с СУБД по ее протоколу, поэтому можно предположить, что драйвер четвертого типа будет более эффективным по сравнению с третьим типом с точки зрения производительности. Первый тип используется реже, в тех случаях, когда у СУБД нет своего драйвера JDBC, зато есть драйвер ODBC.
Последовательность работы с бд
Приложение, работающее с БД, работает по следующей обычной последовательности действий:
1. Загрузка класса драйвера БД при отсутствии экземпляра этого класса.
Для СУБД MySQL:
String driverName=”org.gjt.mm.mysql.Driver”;
Для СУБД MsAccess:
String driverName=”sun.jdbc.odbc.JdbcOdbcDriver ”;
После этого выполняется собственно загрузка драйвера в память:
Class.forName(driverName);
и становится возможным соединение с СУБД.
Эти же действия можно выполнить, импортируя библиотеку и создавая объект явно:
Import COM.ibm.db2.jdbc.net.DB2Driver;
new Db2Driver();
для СУБД DB2.
2. Установка соединения с БД в виде:
Connection cn=
DriverManager.getConnection
(“jdbc:mysql://localhost/mydb”,”login”,”pass”);
Connection cn=
DriverManager.getConnection(“jdbc:odbc:Konditerskaya”);
В результате будет возвращен объект Connection и будет установлено соединение с соответствующей БД.
Класс DriverManager предоставляет средства для управления набором драйверов баз данных. Методу getConnection() необходимо передать тип и физическое месторасположение БД, а также логин и пароль для доступа. С помощью метода registerDriver() драйверы регистрируются, а методом getDrivers() можно получить список всех драйверов.
3. Создание объекта для передачи запросов
Statement st=cn.createStatement();
Объект класса Statement используется для выполнения запроса без его предварительной подготовки и команд SQL. Могут применяться также операторы для выполнения подготовленных запросов и хранимых процедур PreparedStatement и CallableStatement. Созданный объект можно использовать для выполнения запроса.
4. Выполнение запроса
Результаты выполнения запроса помещаются в объект класса ResultSet:
ResutSet rs=st.executeQuery(“SELCT * FROM mytable”);
Для добавления или изменения информации в таблице вместо метода executeQuery() запрос помещается в метод executeUpdate().
5. Обработка результатов выполнения запроса производится методами интерфейса ResultSet, где самыми распространенными являются next() и getString() и аналогичные методы, начинающиеся с getТип() и updateТип(). Среди них следует выделить методы getClob() и getBlob(), позволяющие извлекать из полей таблицы специфические объекты (Character Large Object, Binary Large Object), которые могут быть, например, графическими или архивными файлами. Эффективным способом извлечения значения поля из таблицы является обращение к этому полю по его позиции в строке.
При первом вызове метода next() указатель перемещается на таблицу результатов выборки в позицию первой строки таблицы ответа. Когда строки закончатся, метод возвратит false.
6. Закрытие соединения
cn.close();
Если база больше не нужна, соединение закрывается.
Следующий пример демонстрирует консольное приложение для работы с БД. Создается консольное приложение, которое связывается с базой данных, реализованной в Microsoft Access. В БД в одной табличке хранится информация о кондитерском ассортименте. Программа выводит информацию, хранимую в таблице, добавляет записи, удалять и редактирует их.
import java.awt.*; // импортирование пакета awt
import java.net.*; // импортирование пакета для работы в сети
import java.sql.*; // импортирование пакета sql
import java.io.*; // импортирование пакета ввода-вывода
// вывод на консоль пунктов меню
System.out.println(«Vyberite punkt menu:»);
public static void main(String args[])/ объявление метода main ()
String nazv, cena, naim; int massa;
// создание буферизированного символьного потока ввода
BufferedReader stdin = new BufferedReader(new
BufferedReader in=new BufferedReader(new
String url=»jdbc:odbc:Konditerskaya»;// ссылка на драйвер базы данных
//интерфейса JAVA-ODBC, без которого JAVA не сможет связаться
//с установленным ODBC-драйвером.
Connection db=DriverManager.getConnection(url); // установление
//соединения с базой данных
menu();//вывод пунктов меню
Statement sq=db.createStatement();//cоздание объекта
//для передачи запросов
String vybor = stdin.readLine();// чтение строки, вводимой с клавиатуры
// формирование строки запроса
String sq_str=»SELECT * FROM Assortiment»;
ResultSet rs= sq.executeQuery(sq_str); // команда на выполнение запроса
nazv=rs.getString(«Nazvanie»);// возвращает содержимое поля Nazvanie
cena=rs.getString(«Cena»);// возвращает содержимое поля Cena
// возвращает содержимое поля Naimenovanie
// возвращает содержимое поля Massa
System.out.println(«Mogete dobavit’ novuyu produkciyu:»);
naim=in.readLine();// чтение наименования, вводимого с клавиатуры
nazv=in.readLine();// чтение названия, вводимого с клавиатуры
cena=in.readLine();// чтение цены, вводимой с клавиатуры
// чтение массы, вводимой с клавиатуры
// формирование строки запроса
String sq_str=»INSERT INTO Assortiment VALUES (‘»+naim+»‘,'»+nazv+»‘,'»+
int rs= sq.executeUpdate(sq_str); // команда на выполнение запроса
System.out.println(«Mogete udalit’ assortiment:»);
System.out.println(«Vvedite naimenovanie assortimenta:»);
naim=in.readLine();// чтение наименования, вводимого с клавиатуры
// формирование строки запроса
String sq_str=»DELETE FROM Assortiment WHERE Naimenovanie ='»+naim+»‘»;
int rs= sq.executeUpdate(sq_str); // команда на выполнение запроса
System.out.println(«Vvedite naimenovanie assortimenta,kotoroe hotite redaktirovat»);
vibor=in.readLine();// чтение наименования, вводимого с клавиатуры
System.out.println(«Vvedite novoe naimenovanie:»);
naim=in.readLine();// чтение наименования, вводимого с клавиатуры
System.out.println(«Vvedite novoe nazvanie:»);
nazv=in.readLine();// чтение названия, вводимого с клавиатуры
System.out.println(«Vvedite novuju cenu:»);
cena=in.readLine();// чтение цены, вводимой с клавиатуры
System.out.println(«Vvedite novuju massu:»);
// чтение массы, вводимой с клавиатуры
// формирование строки запроса
String sq_str=»UPDATE Assortiment SET Naimenovanie='»+naim+
«‘,Nazvanie='»+nazv+»‘,Cena='»+cena+»‘,Massa WHERE Naimenovanie='»+vibor+»‘»;
int rs= sq.executeUpdate(sq_str); // команда на выполнение запроса
System.exit(0);//выход из программы
Для запуска приложения необходимо сначала в Microsoft Access создать таблицу Assortiment, которая должна содержать следующие поля (табл. 4.1):
JDBC – Типы драйверов
Драйверы JDBC реализуют определенные интерфейсы в API JDBC для взаимодействия с вашим сервером базы данных.
Например, использование драйверов JDBC позволяет открывать соединения с базой данных и взаимодействовать с ними, отправляя команды SQL или базы данных, а затем получая результаты с помощью Java.
Пакет Java.sql , который поставляется с JDK, содержит различные классы с определенным поведением и их фактические реализации выполняются в сторонних драйверах. Сторонние поставщики реализуют интерфейс java.sql.Driver в своем драйвере базы данных.
Типы драйверов JDBC
Реализации драйвера JDBC различаются из-за большого разнообразия операционных систем и аппаратных платформ, в которых работает Java. Sun поделила типы реализации на четыре категории: типы 1, 2, 3 и 4, что объясняется ниже:
Тип 1: драйвер моста JDBC-ODBC
В драйвере типа 1 мост JDBC используется для доступа к драйверам ODBC, установленным на каждом клиентском компьютере. Использование ODBC требует настройки в вашей системе имени источника данных (DSN), которое представляет целевую базу данных.
Когда впервые появилась Java, это был полезный драйвер, потому что большинство баз данных поддерживали только доступ ODBC, но теперь этот тип драйвера рекомендуется только для экспериментального использования или когда нет другой альтернативы.
JDBC-ODBC Bridge, поставляемый с JDK 1.2, является хорошим примером такого типа драйвера.
Тип 2: JDBC-собственный API
В драйвере типа 2 вызовы API JDBC преобразуются в собственные вызовы API C / C ++, которые являются уникальными для базы данных. Эти драйверы обычно предоставляются поставщиками баз данных и используются так же, как мост JDBC-ODBC. Драйвер для конкретного поставщика должен быть установлен на каждом клиентском компьютере.
Если мы изменим базу данных, нам придется изменить собственный API, поскольку он специфичен для базы данных, и в настоящее время они в основном устарели, но вы можете заметить некоторое увеличение скорости с драйвером типа 2, потому что это устраняет накладные расходы ODBC.

Драйвер Oracle Call Interface (OCI) является примером драйвера типа 2.
Тип 3: JDBC-Net чистая Java
В драйвере типа 3 для доступа к базам данных используется трехуровневый подход. Клиенты JDBC используют стандартные сетевые сокеты для связи с сервером приложений промежуточного программного обеспечения. Затем информация о сокете преобразуется сервером приложений промежуточного программного обеспечения в формат вызова, требуемый СУБД, и пересылается на сервер базы данных.
Этот тип драйвера является чрезвычайно гибким, поскольку он не требует кода, установленного на клиенте, и один драйвер может фактически обеспечить доступ к нескольким базам данных.

Вы можете думать о сервере приложений как о «прокси» JDBC, что означает, что он выполняет вызовы для клиентского приложения. В результате вам понадобятся некоторые знания о конфигурации сервера приложений, чтобы эффективно использовать этот тип драйвера.
Ваш сервер приложений может использовать драйвер типа 1, 2 или 4 для связи с базой данных, понимание нюансов окажется полезным.
Тип 4: 100% Чистая Ява
В драйвере типа 4 драйвер на основе чистого Java напрямую связывается с базой данных поставщика через сокетное соединение. Это драйвер самой высокой производительности, доступный для базы данных, который обычно предоставляется самим поставщиком.
Этот тип драйвера чрезвычайно гибок, вам не нужно устанавливать специальное программное обеспечение на клиент или сервер. Далее, эти драйверы могут быть загружены динамически.

Драйвер MySQL Connector / J является драйвером типа 4. Из-за запатентованного характера своих сетевых протоколов поставщики баз данных обычно предоставляют драйверы типа 4.
Какой драйвер следует использовать?
Если вы обращаетесь к базе данных одного типа, например, Oracle, Sybase или IBM, предпочтительный тип драйвера – 4.
Если ваше Java-приложение обращается к нескольким типам баз данных одновременно, предпочтительным драйвером является тип 3.
Драйверы типа 2 полезны в ситуациях, когда драйверы типа 3 или 4 еще не доступны для вашей базы данных.
Драйвер типа 1 не считается драйвером уровня развертывания и обычно используется только в целях разработки и тестирования.
Типы драйверов JDBC
Драйвер JDBC – это набор классов Java, которые реализуют интерфейсы JDBC, предназначенные для конкретной базы данных. Интерфейсы JDBC поставляются со стандартной Java, но реализация этих интерфейсов зависит от базы данных, к которой необходимо подключиться.
Такая реализация называется драйвером JDBC. Драйверы JDBC обычно поставляются поставщиком базы данных, но иногда могут предоставляться сообществом разработчиков вокруг базы данных.
Список типов драйверов JDBC
Существует четыре различных типа драйвера JDBC. Эти типы драйверов:
- Тип 1: драйвер JDBC моста JDBC-ODBC
- Тип 2: драйвер JDBC для собственного кода Java +
- Тип 3: Все драйверы JDBC для перевода Java + Middleware
- Тип 4: Все драйверы Java JDBC.
Сегодня большинство драйверов JDBC являются драйверами типа 4. Тем не менее, я только кратко расскажу о 4 типах драйверов JDBC.
Драйвер JDBC типа 1
Драйвер JDBC типа 1 состоит из части Java, которая переводит вызовы интерфейса JDBC в вызовы ODBC. Затем мост ODBC вызывает драйвер ODBC для данной базы данных. Драйверы типа 1(были) в основном предназначались для использования в начале, когда не было драйверов типа 4(все драйверы Java). Вот иллюстрация того, как организован драйвер JDBC типа 1:

Драйвер JDBC типа 2
Драйвер JDBC типа 2 подобен драйверу типа 1, за исключением того, что часть ODBC заменяется частью собственного кода. Часть собственного кода предназначена для конкретного продукта базы данных. Вот иллюстрация драйвера JDBC типа 2:

Драйвер JDBC типа 3
Драйвер JDBC типа 3 – это полностью драйвер Java, который отправляет вызовы интерфейса JDBC на промежуточный сервер. Затем промежуточный сервер подключается к базе данных от имени драйвера JDBC. Вот иллюстрация драйвера JDBC типа 3:

Драйвер JDBC типа 4
Драйвер JDBC типа 4 является полностью драйвером Java, который подключается непосредственно к базе данных. Он реализован для конкретного продукта базы данных. Сегодня большинство драйверов JDBC являются драйверами типа 4. Вот иллюстрация того, как организован драйвер JDBC типа 4:
Типы JDBC-драйверов Java

Каждый JDBC-драйвер принадлежит одному из перечисленных ниже типов.
- Драйвер типа 1. Транслирует JDBC в ODBC и для взаимодействия с базой данных использует драйвер ODBC. Компания Sun включила в состав JDK один такой драйвер — мост JDBC/ODBC. Однако для его использования требуется соответствующим образом установить и конфигурировать ODBC-драйвер. В первом выпуске JDBC этот мост предполагалось использовать только для тестирования, а не для рабочего применения. В настоящее время уже имеется большое количество более удачных драйверов.
- Драйвер типа 2. Создается преимущественно на языке Java и частично на собственном языке программирования, который используется для взаимодействия с клиентским API базы данных. Для использования такого драйвера нужно помимо библиотеки Java установить специфический для данной платформы код.
- Драйвер типа 3. Создается только на основе библиотеки Java, в которой используется независимый от базы данных протокол взаимодействия сервера и базы. Этот протокол позволяет транслировать запросы в соответствии со спецификой конкретной базы. Если код, зависящий от базы данных, находится только на сервере, развертывание существенно упрощается.
- Драйвер типа 4. Представляет собой библиотеку Java, которая транслирует JDBC-запросы непосредственно в протокол конкретной базы данных.
Большинство поставщиков баз данных применяют драйверы типа 3 или 4. Кроме того, некоторые компании специализируются на создании драйверов, которые позволяют добиться более полного соответствия принятым стандартам, поддерживают большое количество платформ, обладают более высокой производительностью или надежностью, чем драйверы, предлагаемые производителями СУБД.
Основные цели интерфейса JDBC можно сформулировать следующим образом.
- Разработчики создают программы на языке Java, пользуясь для доступа к базам данных стандартными средствами языка SQL(или его специализированным расширениями); при этом они следуют только соглашениям языка Java.
- Производители СУБД и инструментальных средств поставляют драйверы только низкого уровня.
На конференции JavaOne в мае 1996года представители Sun указали ряд причин отказа от модели ODBC.