jdbc что это такое простыми словами
Национальная библиотека им. Н. Э. Баумана
Bauman National Library
Персональные инструменты
JDBC (Java DataBase Connectivity)
Разработчики: | Oracle Corporation |
---|---|
Выпущена: | 5 December 2013 года ; 7 years ago ( 2013-12-05 ) |
Постоянный выпуск: | JDBC 4.2 |
Тип ПО: | Data Access API |
Веб-сайт | JDBC |
Содержание
Архитектура
Рисунок 1 – Архитектура Java Applet/Application
Рисунок 2 – Архитектура Java Application
Левая сторона. Тип 1: Java драйвер для прямого подключения к БД
Этот тип драйвера преобразует запросы JDBC в сетевой протокол, используемый непосредственно СУБД, позволяющая осуществлять прямой запрос с компьютера клиента на сервер СУБД и предоставляющая практическое решение для доступа в интрасеть.
Правая сторона. Тип 2: Java драйвер для промежуточного БД
Данный тип переводит запросы JDBC в протокол поставщика промежуточного ПО, который далее преобразуется в протокол СУБД сервером промежуточного ПО. Промежуточное ПО обеспечивает подключение ко многим различным БД.
На рисунке 2 показано подключение JDBC с использованием драйверов ODBC и существующих клиентских библиотек БД.
Левая сторона. Тип 3: JDBC-ODBC мост с драйверами ODBC
Эта комбинация обеспечивает доступ JDBC через драйвера ODBC. Бинарный код ODBC должен быть загружен на каждом компьютере клиента, который использует мост JDBC-ODBC.
Правая сторона. Тип 4: Встроенный API драйвер с частичной технологией Java
Этот тип драйвера преобразует запросы JDBC в запросы клиентского API для Oracle, Sybase, Informix, DB2 или других СУБД.
Преимущества и недостатки
Преимуществами JDBC считают:
Недостатками JDBC являются:
Сравнение JDBC и ODBC
JDBC | ODBC | |
---|---|---|
Архитектура | Базовая архитектура поддерживает как двухуровненвые, так и трехуровневые модели обработки БД, но в основном состоит из двух уровней архитектуры: JDBC API и JDBC Driver API | Архитектура ODBC в основном состоит из 4 компонентов: драйвер, диспетчер драйверов, API и источник данных |
Сложность | В случае с JDBC кодирование является начальным этапом комплексного программирования запросов | Обрабатывает различные сложные ситуации и запросы для получения правильных выходных данных машинного уровня. Так что это продвинутая версия кодирования и других разных подходов. |
Язык программирования | Java | C, C++, Java и т.д. |
Платформа | Выполняется на любых платформах | Выполняется только на Windows |
Режим работы | Работает на языке Java и может быть скомпилирован непосредственно во время выполнения | Реализован на Visual Basic, поэтому код необходимо интерпретировать, а затем выполнить |
Безопасность | Пользователи не имеют доступа к основным настройкам системы, следовательно, нарушения и дыры в безопасности можно быстро исправить | Интерактивный сервер пользователя, подвержен ошибкам пользователя |
Поддержка | Поддержка сообщества для JDBC и его пользователей | Предоставляют большой спектр сообщества и платную поддержку. Обычно все версии ODBC используют для обеспечения долгосрочной поддержки клиентов |
Примеры
JDBC для MySQL
Данный пример использует свободный драйвер JDBC для MySQL, который легко устанавливается в большинстве дистрибутивов Linux через стандартные репозитории.
JDBC для Microsoft SQL Server
Данный пример использует jTDS, свободный драйвер JDBC для Microsoft SQL Server и Sybase ASE SQL-Server. Подключиться к этой и другим СУБД можно и встроенными средствами с помощью драйвера JDBC для ODBC, но ценой замедления работы.
Собеседование по Java EE — SQL, JDBC (вопросы и ответы)
Вопросы и ответы для собеседования о применении SQL, JDBC в Java разработке.
к списку вопросов раздела JEE
Вопросы
1. ANSI SQL
2. Основные элементы баз данных – таблицы, процедуры, функции, констрейнты и т.д..
3. Как вы понимаете null в базах данных?
4. Агрегатные функции, как они работают с null. Не забудьте о group by и having
5. Каким образом лучше добавлять большое количество записей в таблицу?
6. Что такое первая нормальная форма и процесс нормализации? Какие бывают нормальные формы?
7. В чем смысл индекса СУБД, как они устроены, как хранятся? Как бы вы реализовали тот же функционал?
8. Что такое JDBC API и когда его используют?
9. Что такое JDBC Driver и какие различные типы драйверов JDBC вы знаете?
10. Как JDBC API помогает достичь слабой связи между Java программой и JDBC Drivers API?
11. Что такое JDBC Connection? Покажите шаги для подключения программы к базе данных.
12. Как используется JDBC DriverManager class?
13. Как получить информацию о сервере базы данных из java программы?
14. Что такое JDBC Statement?
15. Какие различия между execute, executeQuery, executeUpdate?
16. Что такое JDBC PreparedStatement?
17. Как установить NULL значения в JDBC PreparedStatement?
18. Как используется метод getGeneratedKeys() в Statement?
19. Какие преимущества в использовании PreparedStatement над Statement?
20. Какие есть ограничения PreparedStatement и как их преодолеть?
21. Что такое JDBC ResultSet?
22. Какие существуют различные типы JDBC ResultSet?
23. Как используются методы setFetchSize() и SetMaxRows() в Statement?
24. Как вызвать Stored Procedures используя JDBC API?
25. Что такое JDBC Batch Processing и какие его преимущества?
26. Что такое JDBC Transaction Management и зачем он нужен?
27. Как откатить JDBC транзакцию?
28. Что такое JDBC Savepoint и как он используется?
29. Расскажите о JDBC DataSource. Какие преимущества он дает?
30. Как создать JDBC пул соединений используя JDBC DataSource и JNDI в Apache Tomcat Server?
31. Расскажите про Apache DBCP API.
32. Какие вы знаете уровни изоляции соединений в JDBC?
33. Что вы знаете о JDBC RowSet? Какие существуют различные типы RowSet?
34. В чем разница между ResultSet и RowSet?
35. Приведите пример наиболее распространенных исключений в JDBC.
36. Расскажите о типах данных CLOB и BLOB в JDBC.
37. Что вы знаете о «грязном чтении» (dirty read) в JDBC? Какой уровень изоляции предотвращает этот тип чтения?
38. Какие есть две фазы commit?
39. Приведите пример различных типов блокировки в JDBC.
40. Как вы понимаете DDL и DML выражения?
41. Какая разница между java.util.Date и java.sql.Date?
42. Как вставить изображение или необработанные данные в базу данных?
43. Что вы можете рассказать о фантомном чтении? Какой уровень изоляции его предотвращает?
44. Что такое SQL Warning? Как возвратить SQL предупреждения в JDBC программе?
45. Как запустить Oracle Stored Procedure с объектами базы данных IN/OUT?
46. Приведите пример возникновения java.sql.SQLException: No suitable driver found.
47. Best Practices в JDBC.
Ответы
1. ANSI SQL
SQL (structured query language — «язык структурированных запросов») — формальный непроцедурный язык программирования, применяемый для создания, модификации и управления данными в произвольной реляционной базе данных, управляемой соответствующей системой управления базами данных (СУБД). SQL основывается на исчислении кортежей. Стандарт SQL определяется с помощью кода ANSI.
*Вопрос «расскажите о SQL» очень широкий и не вписывается в рамки этой статьи. К прочтению любая информация из интернета, например:
SQL : ОБЗОР: http://www.sql.ru/docs/sql/u_sql/ch2.shtml
Wiki: https://ru.wikipedia.org/wiki/SQL
2. Основные элементы баз данных – таблицы, процедуры, функции, констрейнты и т.д.
Поле — это минимальный элемент базы данных, содержащий один неделимый квант информации. Каждое поле характеризуется именем и типом хранящихся в нем данных.
Запись — это совокупность нескольких разнородных полей, описывающая некоторую сущность предметной области.
Таблица базы данных — это набор однородных записей.
Хранимая процедура — объект базы данных, представляющий собой набор SQL-инструкций, который компилируется один раз и хранится на сервере. Хранимые процедуры очень похожи на обыкновенные процедуры языков высокого уровня, у них могут быть входные и выходные параметры и локальные переменные, в них могут производиться числовые вычисления и операции над символьными данными, результаты которых могут присваиваться переменным и параметрам. В хранимых процедурах могут выполняться стандартные операции с базами данных (как DDL, так и DML). Кроме того, в хранимых процедурах возможны циклы и ветвления, то есть в них могут использоваться инструкции управления процессом исполнения.
Русские Блоги
JDBCTemplate и JDBC
JDBCTemplate и JDBC
1. Введение в JDBCTemplate и JDBC
(1) Что такое JDBC?
Он может предоставлять унифицированный доступ к нескольким реляционным базам данных и состоит из набора классов и интерфейсов, написанных на языке Java.
Программисты JAVA в основном отвечают за внутреннюю обработку данных в своей работе. Для обработки данных будет использоваться база данных для хранения данных. Существует несколько методов для работы с базой данных:
① Команда cmd напрямую выполняет оператор SQL для работы с базой данных.
Database База данных программного обеспечения, например, Navicat
JDBC используется для соединения программы Java и базы данных
JDBC разработал стандартный интерфейс для равномерного доступа к различным реляционным базам данных, предоставляя стандартную реализацию интерфейса для различных поставщиков баз данных.
Спецификация JDBC классифицирует драйверы по следующим категориям (изCore Java Volume Ⅱ——Advanced Features):
(2) Что такое JDBCTemplate?
JDBCTemplate выполняет JDBC. В JDBC вам необходимо установить соединение перед взаимодействием с базой данных, то есть зарегистрировать драйвер, а затем ввести учетную запись и пароль для получения соединения с базой данных.
Таким образом, каждый раз, когда вы пишете программу, вы должны сначала написать набор кода для создания соединения, что не только увеличивает объем кода, но и многократное подключение к базе данных также приведет к неэффективной работе программы.
Spring предоставляет хорошее решение, и он автоматически управляет операцией подключения к базе данных. Программисту нужно только записать регистрацию драйвера ответа, пароль учетной записи и т. Д. В файл конфигурации без повторного ввода. Просто используйте его непосредственно из пружинного контейнера, когда вам это нужно.
Прежде чем изучать JDBC, мы должны сначала понять трехуровневую архитектуру Java. Эта идея проектирования трехуровневой архитектуры более популярна в веб-программировании. JDBC, который является постоянным уровнем (уровнем доступа к данным) в трехуровневой архитектуре, используется для взаимодействия с данными.
(3) трехуровневая архитектура Java
Как правило, Java делится на три слоя:
Layer Презентационный слой (вид)
② Уровень бизнес-логики (сервис бизнес-уровня)
Layer Уровень персистентности (уровень доступа к данным дао)
Во-вторых, роль JDBCTemplate и JDBC
(1) Что сделал JDBC
(2) Что сделал JDBCTemplate.
(3) Как это делает jdbcTemplate?
Как он это сделал, это связано с Spring. Контейнер SpringIOC управляет источником данных, который управляет подключением к базе данных, как обычный Java Bean, а затем внедряет источник данных в класс инкапсуляции JdbcTemplate. Свойство dataSource JdbcTemplate является источником данных, который вводится в конфигурацию.
Давайте продемонстрируем, как использовать JDBC и JDBCTemplate
(1) Создать проект
(2) Импорт зависимостей mysql
(3) Зарегистрируйте драйвер и подключитесь к базе данных
(4) Напишите метод main и выполните инструкцию sql.
(5) Запустите основной метод
[Передача изображения по внешней цепочке не удалась, на исходном сайте может быть механизм защиты от кражи, рекомендуется сохранить изображение и загрузить его напрямую (img-mqtGvg9B-1574236793883) (C: \ Users \ shiyang \ AppData \ Roaming \ Typora \ typora-user-images \ изображение-20191115205323627.png)]
ID и имя напечатаны
(6) Изменить на JDBCTemplate
Сначала напишите db.properties
Четыре, общие проблемы
(1) Четыре интерфейса JDBC
(2) В чем разница между JdbcTemplate и JDBC?
jdbc должен каждый раз подключаться к базе данных, а затем обрабатывать операторы SQL, передавать значения и закрывать базу данных. Иногда может даже случиться, что база данных забудет закрыть и соединение занято. В будущей работе потребности клиента не должны быть статичными, что приводит к Содержимое базы данных часто изменяется. С помощью JDBCtemplate нам нужно изменить только часть содержимого, которое необходимо изменить, и никаких глобальных изменений не требуется. Spring завершит все подробности JDBC для нас.
(3) В чем разница между execute и executeUpdate?
excute и executeUpdate одинаковы тем, что могут выполнять добавление, удаление и изменение.
Разница в том, что execute может выполнить оператор запроса, а затем получить результат через getResult.
excute возвращает логический тип, true указывает, что оператор запроса выполнен, а false указывает, что выполняются такие операторы, как добавление, удаление, изменение и т. д.
excuteUpdate возвращает тип int, указывающий, сколько частей данных было затронуто
(4) Полностью создать проект JDBC, каков конкретный процесс?
(5) Как понять Class.forName
Смотрите описание исходного кода
Returns the Class object associated with the class or interface with the given string name, using the given class loader. Given the fully qualified name for a class or interface (in the same format returned by getName) this method attempts to locate, load, and link the class or interface. The specified class loader is used to load the class or interface. If the parameter loader is null, the class is loaded through the bootstrap class loader. The class is initialized only if the initialize parameter is true and if it has not been initialized earlier.
Перевести с помощью Google
Используйте данный загрузчик классов, чтобы вернуть объект Class, связанный с классом или интерфейсом с заданным именем строки. Учитывая полное имя класса или интерфейса (тот же формат, который возвращается в getName), этот метод пытается найти, загрузить и связать класс или интерфейс. Указанный загрузчик классов используется для загрузки класса или интерфейса. Если параметр loader имеет значение null, класс загружается через загрузчик классов загрузки. Этот класс инициализируется только тогда, когда параметр initialize имеет значение true, и он не был инициализирован ранее.
Подводя итогВозвращает объект класса в соответствии с загрузчиком классов, используемый для загрузки класса и интерфейса. Он используется для инициализации этого класса.
Введение в JDBC
Краткое и практическое введение в JDBC на Java.
1. Обзор
В этой статье мы рассмотрим JDBC (Подключение к базе данных Java), который представляет собой API для подключения и выполнения запросов к базе данных.
JDBC может работать с любой базой данных при условии наличия надлежащих драйверов.
2. Драйверы JDBC
Драйвер JDBC-это реализация API JDBC, используемая для подключения к определенному типу базы данных. Существует несколько типов драйверов JDBC:
3. Подключение к базе данных
Чтобы подключиться к базе данных, нам просто нужно инициализировать драйвер и открыть соединение с базой данных.
3.1. Регистрация водителя
Для нашего примера мы будем использовать драйвер протокола базы данных типа 4.
Поскольку мы используем базу данных MySQL, нам нужна зависимость mysql-connector-java :
3.2. Создание соединения
Поскольку Соединение является автоклавируемым ресурсом, мы должны использовать его внутри попробуйте с ресурсами |/блок .
Синтаксис URL-адреса подключения зависит от типа используемой базы данных. Давайте рассмотрим несколько примеров:
Чтобы подключиться к указанной myDb базе данных, нам нужно будет создать базу данных и пользователя, а также добавить необходимый доступ:
4. Выполнение инструкций SQL
4.1. Заявление
Интерфейс Оператор содержит основные функции для выполнения команд SQL.
Во-первых, давайте создадим Оператор объект:
Опять же, мы должны работать с Оператором s внутри блока try-with-resources для автоматического управления ресурсами.
В любом случае, выполнение инструкций SQL может быть выполнено с помощью трех методов:
Давайте используем метод execute() для добавления таблицы студенты в нашу базу данных:
При использовании выполнить() способ обновления данных, затем stmt.getUpdateCount() метод возвращает количество затронутых строк.
Если результат равен 0, то либо строки не были затронуты, либо это была команда обновления структуры базы данных.
Далее давайте добавим запись в нашу таблицу с помощью метода executeUpdate() :
Метод возвращает количество затронутых строк для команды, обновляющей строки, или 0 для команды, обновляющей структуру базы данных.
4.2. Подготовленное Заявление
Объекты PreparedStatement содержат предварительно скомпилированные последовательности SQL. Они могут иметь один или несколько параметров, обозначенных знаком вопроса.
Оператор выполняется одним из тех же трех методов, описанных ранее: ExecuteQuery (), executeUpdate (), execute() без параметра SQL String :
4.3. Вызываемое утверждение
Интерфейс CallableStatement позволяет вызывать хранимые процедуры.
Для создания объекта CallableStatement мы можем использовать prepareCall() метод Подключения :
Если хранимая процедура имеет выходные параметры, нам нужно добавить их с помощью метода registerOutParameter() :
Затем давайте выполним инструкцию и получим возвращенное значение, используя соответствующий метод getX() :
Например, для работы нам нужно создать хранимую процедуру в нашей базе данных MySQL:
Описанная выше процедура insertEmployee вставит новую запись в таблицу сотрудники с использованием заданных параметров и вернет идентификатор новой записи в параметре emp_id out.
Чтобы иметь возможность запускать хранимую процедуру с Java, пользователь подключения должен иметь доступ к метаданным хранимых процедур. Этого можно достичь, предоставив пользователю права на все хранимые процедуры во всех базах данных:
5. Анализ Результатов Запроса
5.1. Интерфейс набора результатов
Результирующий набор использует метод next() для перехода к следующей строке.
Давайте сначала создадим класс Employee для хранения полученных записей:
Далее давайте пройдемся по Набору результатов и создадим объект Сотрудник для каждой записи:
Получение значения для каждой ячейки таблицы можно выполнить с помощью методов типа get X ( ), где X представляет тип данных ячейки.
5.2. Обновляемый набор результатов
Неявно объект ResultSet может быть пройден только вперед и не может быть изменен.
Если мы хотим использовать Набор результатов для обновления данных и перемещения их в обоих направлениях, нам необходимо создать Оператор объект с дополнительными параметрами:
Для навигации по этому типу Результирующего набора мы можем использовать один из методов:
Чтобы сохранить Результирующий набор изменений в базе данных, мы должны дополнительно использовать один из методов:
Давайте рассмотрим пример использования некоторых из этих методов путем обновления данных в таблице сотрудник :
6. Анализ Метаданных
API JDBC позволяет просматривать информацию о базе данных, называемую метаданными.
6.1. DatabaseMetaData
Интерфейс DatabaseMetaData может использоваться для получения общей информации о базе данных, такой как таблицы, хранимые процедуры или диалект SQL.
Давайте быстро рассмотрим, как мы можем извлекать информацию из таблиц базы данных:
6.2. ResultSetMetaData
7. Обработка Транзакций
Это может быть необходимо в тех случаях, когда мы хотим сохранить согласованность данных, например, когда мы хотим совершить транзакцию только в том случае, если предыдущая транзакция была успешно завершена.
Давайте добавим второе заявление об обновлении для столбца зарплата после обновления столбца сотрудник должность и заключим их в транзакцию. Таким образом, зарплата будет обновлена только в том случае, если должность была успешно обновлена:
8. Закрытие ресурсов
Мы можем сделать это с помощью close() API:
То же самое верно и для Заявление s, Подготовленное Заявление s, Вызываемое утверждение s, и Набор результатов s.
9. Заключение
В этом уроке мы рассмотрели основы работы с API JDBC.
Обзор спецификации JDBC
Мы попытаемся разобраться с основными понятиями JDBC, последовательно разбирая содержание спецификации. Надеюсь, что этот материал окажется не просто введением или обзором JDBC, но и чем-то вроде навигатора по спецификации. Для этого в качестве разделов основной части статьи использовались названия глав спецификации с приведением их оригинальных названий.
Спецификация
1. Введение (Introduction)
JDBC, также как и Microsoft ODBC и Borland DataBase Engine (BDE), базируется на X/Open SQL CLI (Call Level Interface). Авторы спецификации обращают особое внимание на то, что их основная задача состоит в описании основных абстракций и концепций, определенных в X/Open CLI, в виде натуральных («родных») интерфейсов Java.
Для того чтобы лучше понять суть подхода, используемого в JDBC, напомню, что представляют из себя интерфейсы Java. В отличие от классов, заключающих в себе как объявление, так и реализацию методов, интерфейсы обеспечивают более высокий уровень абстракции, описывая только объявления методов. Учитывая возможность наследования, причем наследования множественного (в отличие от классов), такой подход позволяет создавать программы, предназначенные для работы с базами данных, не зависящие от конкретной реализации как самой СУБД, так и методов доступа к ней. Для того чтобы обратиться к конкретной СУБД (подразумеваются серверы баз данных), будь это Oracle, Informix, InterBase или что-то другое, разработчику необходим JDBC-драйвер. В концепции универсиализации доступа к данным через стандартные интерфейсы (мы их рассмотрим ниже в этой статье) JDBC-драйвер есть совокупность классов, реализующих JDBC-интерфейсы. Под реализацией интерфейса в Java понимается создание класса, ссылающегося в своем объявлении на интерфейс и предлагающего конкретную реализацию методов интерфейса уже в виде методов данного класса.
2. Цели и философия (Goals and phylosophy)
Этот раздел спецификации определяет приоритеты, заложенные в основу взаимодействия Java-программ и баз данных.
3. Обзор основных интерфейсов (Overview of the major interfaces)
Данный раздел дает краткое описание базовых интерфейсов (3.1 The JDBC API) и интерфейса драйвера (3.2 The JDBC Driver Interface).
Первая часть этого раздела выделяет как наиболее важные следующие интерфейсы (общая схема их взаимодействия представлена на рис. 1):
Рисунок 1.
Основные интерфейсы JDBC.
Наконец, приведем простейший пример установки соединения и получения данных из БД:
Рисунок 2.
Уровни реализации JDBC API.
Конечно, в реальной системе нам необходимо обработать возможные исключительные ситуации, которые могут возникнуть при неправильном вводе пароля, указании несуществующей таблицы в SQL-запросе и т.п. Однако, построение полнофункционального приложения не есть цель данной статьи, оставим ее авторам книг по Java и JDBC.
4. Сценарии использования (Scenarios of using)
В этом случае сценарий взаимодействия такого апплета с БД будет напоминать следующий (см. рис. 3).
В зависимости от конкретной архитектуры реализации драйвера клиентская часть сервера баз данных может присутствовать на клиенте или только на web-сервере (или другом сервере, доступном в сети). В первом случае JDBC-драйвер обычно реализуется как набор Java-классов, описывающих интерфейсы java.sql.* через native-вызовы (платформно-зависимый код). Во втором случае JDBC-драйвер обычно называют JDBC-Net. Он написан целиком на Java и обращается к серверу баз данных по TCP/IP, формируя дейтаграммы в формате, понятном серверу.
Понятно, что типичные апплеты отличаются от традиционных приложений баз данных целым рядом особенностей:
Архитектура Java позволяет также создавать и самостоятельные приложения (4.2). Конечно, они, как и апплеты, выполняются виртуальной машиной, но в отличие от последних существуют вне контекста web-документов. В этом случае сценарий отличает от описанного выше отсутствие пункта 1, а ограничения на доступ к локальным ресурсам снимается до уровня обращения к ним через виртуальную машину (см. рис. 3).
Рисунок 3.
Взаимодействие приложения с БД.
Кроме двух основных сценариев, описанных выше, этот раздел содержит и упоминание «безопасных» (trusted) апплетов и трехзвенной модели (4.3 Other scenarios). Безопасные апплеты включают криптографический ключ и могут, как и приложения, обращаться к локальным ресурсам через виртуальную машину. Случай трех-уровневой архитектуры подразумевает вызов из апплетов или приложений не сервера баз данных напрямую, а сервера приложений/бизнес-логики, который уже, в свою очередь, осуществляет взаимодействие с сервером БД.
На рис. 4 представлена диаграмма взаимодействия Java-кода и баз данных в трехуровневой (точнее, многоуровневой N-tier) модели. Как вы видите, в качестве основных способов взаимодействия между Java-приложениями (апплетами) и серверами среднего звена используются RPC (вызовы удаленных процедур) и CORBA. В случае CORBA, вообще говоря, кроме звена бизнес-логики присутствует и ORB (брокер объектных запросов или, как стало принято называть у нас в литературе, брокер объектных заявок). Что касается самих серверов приложений, то Java (в частности, JDBC) никаких специальных требований к ним не предъявляет, как и в случае с серверами баз данных.
Рисунок 4.
Трехуровневая модель.
5. Соображения безопасности (Security considerations)
Название раздела говорит само за себя. Основной упор в защите доступа к базам данных делается на использование менеджера безопасности Java, реализуемого исполняющей системой (виртуальной Java-машиной).
В отношении апплетов спецификация JDBC (5.1 JDBC and untrusted applets) формулирует следующие основные положения.
В отношении Java-приложений (5.2 JDBC and Java applications) JDBC не накладывает никаких специальных ограничений, загружая драйверы из локального пути имен. Однако, если класс sql.Driver загружается из удаленного источника, этот драйвер может быть использован только тем загружаемым кодом, который имеет один и тот же источник с этим классом.
В качестве шаблона прикладного кода проверки доступ на уровне сетевого взаимодействия (5.3 network security), еще до открытия сессии взаимодействия с базой данных, предлагается следующее:
Далее начинают работать механизмы аутентификации, поддерживаемые той или иной сетевой операционной системой, сервером приложений и сервером баз данных.
Во всех этих случаях базовой конструкцией проверки безопасности является уже знакомый код, выглядящий, в общем случае, следующим образом:
6. Организация соединения с базой данных (Database connections)
Этот раздел освещает основные вопросы, связанные с подсоединением к базе данных.
Для доступа к базе данных необходимо получить объект java.sql.Connection. Сделать это можно, обратившись к уровню управления JDBC посредством вызова java.sql.DriverManager.getConnection. Основным параметром этого вызова является строка URL (Uniform Resource Locator), описывающая такие характеристики соединения, как субпротокол (например, ODBC) и имя базы данных (может быть комплексным, описывая сервер, путь и файл БД). После получения объекта соединения можно начать работу непосредственно с базой данных, обращаясь к методам java.sql.Connection для создания объектов java.sql.Statement, java.sql.PreparedStatement и java.sql.CallableStatement.
Механизм именования баз данных в JDBC, базируясь на URL, решает такие вопросы, как автоматический выбор драйвера, способного осуществить доступ к данной БД, определение характеристик соединения и т.п.
В общем случае спецификация рекомендует следующую конструкцию URL:
В качестве атрибутов могут выступать такие характеристики, как размер кэша (CacheSize), имя пользователя (UID), пароль (PWD) и т.п.
JDBC предусматривает и возможность динамического подсоединения к базе данных. В этом случае вы можете произвести такие операции, как явная загрузка драйвера
Class.forName(«acme.db.Driver»);, его регистрация через вызов DriverManager.registerDriver и т. п.
В случае с ODBC можно привести следующий пример динамического соединения:
7. Передача параметров и получение результатов (Passing parameters and receiving results)
Еще раз приведем пример получения данных из БД:
В данном случае использовалось обращение к столбцам таблицы по их именам. Причем регистр имени столбца не играет роли (case insensitive).
JDBC предусматривает и доступ по номеру столбца:
При этом столбцы нумеруются начиная с 1, а не с нуля.
Очевидно, что при описанных подходах в работе с результирующим множеством строк особое значение приобретает исчерпывающее описание методов ResultSet.getXxxx. Действительно, информация в базе данных часто хранится не только в виде столбцов простейших типов (целое, длинное целое и т. п.), но и в специфических двоичных форматах. Таблица 1 описывает возможность получения данных того или иного типа с помощью соответствующих методов getXxxx (особо выделены те ячейки отображения «метод-тип», использование которых рекомендовано стандартом).
T | S | I | B | R | F | D | D | N | B | C | V | L | B | V | L | D | T | T | |
Y | M | N | I | E | L | O | E | U | I | H | A | O | I | A | O | A | I | I | |
I | A | T | G | A | O | U | C | M | T | A | R | N | N | R | N | T | M | M | |
N | L | E | I | L | A | B | I | E | R | C | G | A | B | G | E | E | E | ||
Y | L | G | N | T | L | M | R | H | V | R | I | V | S | ||||||
I | I | E | T | E | A | I | A | A | Y | N | A | T | |||||||
N | N | R | L | C | R | R | A | R | A | ||||||||||
T | T | C | R | B | M | ||||||||||||||
H | Y | I | P | ||||||||||||||||
A | N | ||||||||||||||||||
Y | |||||||||||||||||||
getByte | X | x | x | x | x | x | x | x | x | x | x | x | x | ||||||
getShort | x | X | x | x | x | x | x | x | x | x | x | x | x | ||||||
getInt | x | x | X | x | x | x | x | x | x | x | x | x | x | ||||||
getLong | x | x | x | X | x | x | x | x | x | x | x | x | x | ||||||
getFloat | x | x | x | x | X | x | x | x | x | x | x | x | x | ||||||
getDouble | x | x | x | x | x | X | X | x | x | x | x | x | |||||||
getNumcric | x | x | x | x | x | x | x | X | X | x | x | x | x | ||||||
getBoolean | x | x | x | x | x | x | x | x | x | X | x | x | x | ||||||
getString | x | x | x | x | x | x | x | x | x | x | X | X | x | x | x | x | x | x | x |
getBytes | X | X | x | ||||||||||||||||
getDate | x | x | x | X | x | ||||||||||||||
getTime | x | x | x | X | x | ||||||||||||||
getTimestamp | x | x | x | x | X | ||||||||||||||
getAsciiSteam | x | x | X | x | x | x | |||||||||||||
getUnicodeStream | x | x | X | x | x | x | |||||||||||||
getBinaryStream | x | x | X | x | x | x | |||||||||||||
getObject | x | x | x | x | x | x | x | x | x | x | x | x | x | x | x | x | x | x | x |
Таблица 1.
Использование методов ResultSet.getXxxx для основных типов SQL.
В рассматриваемом разделе спецификации JDBC определяется и обработка значения SQL «NULL». Для его идентификации можно использовать метод ResultSet.wasNull. В случае чтения «пустых» данных с использованием методов ResultSet.getXxxx вы получите:
Говоря о передаче параметров, мы подразумеваем параметры IN (передаваемые) и OUT (возвращаемые).
В обоих случаях требуется установить взаимное соответствие типов Java и SQL. Отображению типов посвящен раздел 8 спецификации. В данном же контексте для нас важнее методы работы с параметрами объектов, описывающих интерфейсы PreparedStatement и CallableStatement.
При работе с параметрами, также как и при чтении, возможна работа с «большими» данными. Для этого используются такие методы, как setBinaryStream и т. п.
Конечно, мы смогли остановиться лишь на основных моментах, связанных с получением результатов и передачей параметров. Более полную информацию вы сможете найти в самой спецификации.
8. Отображение типов данных SQL в Java (Mapping SQL data types into Java)
SQL type | Java Type |
CHAR | String |
VARCHAR | String |
LONGVARCHAR | String |
NUMERIC | java.sql.Numeric |
DECIMAL | java.sql.Numeric |
BIT | boolean |
TINYNT | byte |
SMALLINT | short |
INTEGER | int |
BIGINT | long |
REAL | float |
FLOAT | double |
DOUBLE | double |
BINARY | byte[ ] |
VARBINARY | byte[ ] |
LONGVARBINARY | byte[ ] |
DATE | java.sql.Date |
TIME | java.sql.Time |
TIMESTAMP | java.sql.Timestamp |
Таблица 2.
Отображение типов SQL в Java.
9. Асинхронные запросы, потоки и транзакции (Asynchrony, Threading, and Transactions)
Новое подключение к базе данных изначально стартует в режиме auto-commit. Это значит, что каждое выражение выполняется в отдельной транзакции. При необходимости можно отменить этот режим, вызвав метод Connection.setAutoCommit с параметром false. После этого необходимо в явном виде указывать операции завершения/отката транзакции посредством вызовов Connection.commit / Connection.rollback. Для определения и контроля уровней изолированности транзакций (набор которых может отличаться для разных серверов баз данных) предлагается использовать методы java.sql.DatabaseMetaData и java.sql.Connection.
10. Курсоры (Cursors)
JDBC предоставляет простейшую поддержку курсоров. Приложения могут использовать ResultSet.getCursorName() для получения курсора, ассоциированного с данным набором строк. После этого с помощью курсора можно выполнять выборочные (с позиционированием) обновления и удаления строк. Однако не все серверы БД поддерживают эти механизмы, поэтому перед их вызовом необходимо удостовериться в такой поддержке с помощью методов DatabaseMetaData.supportPositionedUpdate и DatabaseMetaData.supportPositionedDelete.
11, 12. Расширения SQL (11 SQL Extensions, 12 Variants and Extensions)
Ряд серверов баз данных поддерживают расширения SQL, выходящие за рамки входного уровня стандарта SQL-2. Данный раздел спецификации описывает следующие положения, необходимые для получения драйвером логотипа JDBC-CompliantTM:
Расширения также включают поддержку литералов, специфицирующих величины даты и времени, скалярные функции (в соответствии с семантикой, определенной X/Open CLI и ODBC), escape-последовательности для оператора LIKE и синтаксис outer join.
Раздел 12 включает дополнительные соображения, касающиеся специфики конкретных сервров, по сути, разъясняя достаточно «нейтральную» позицию спецификации, в отношении дополнительной поддержки драйверами особенностей серверов по определению и работе с метаданными. Основным моментом здесь является предоставление всей необходимой информации о расширениях через реализацию интерфейса java.sql.DatabaseMetaData (информация о метаданных).
13. Определение интерфейсов JDBC (JDBC Interface Definitions)
Спецификация не включает полного описания JDBC API, адресуя разработчиков к документации по пакету java.sql. Однако в данном разделе дается диаграмма связей между ними (рис. 6) перечисляются все базовые интерфейсы JDBC:
Интерфейсы ядра JDBC:
14. Динамический доступ к базам данных (Dynamic Database Access)
Авторами спецификации отмечается, что, хотя в большинстве случаев разработчики заранее знают схему базы данных (метаданные), существует ряд задач, когда анализ БД происходит «на лету». Именно для такого анализа и предназначены указанные в предыдущем разделе интерфейсы метаданных. Эти интерфейсы могут использоваться в сочетании с интерфейсами ядра JDBC без каких либо конфликтов со стороны менеджера драйверов или самих драйверов. В продолжение раздела 8 определяется соответствие SQL-типов объектам Java для использования методов getObject и setObject для ввода/вывода данных. В качестве примера использования этих методов можно привести следующий вариант уже знакомой последовательности вызовов на чтение данных:
Рисунок 6.
Важнейшие связи между интерфейсами JDBC.
Приложения
Спецификация JDBC включает четыре приложения.
Приложение B представляет собой набор примеров использования JDBC (использование SELECT и UPDATE).
В Приложении C даются краткие замечания по реализации JDBC на примере работы с результирующим набором строк через интерфейс ResultSetMetaData.
Приложение D содержит список последних изменений и дополнений стандарта JDBC.
В заключение, я еще раз попросил бы читателей обратить внимание непосредственно на саму спецификацию JDBC, так как ни одна статья, популяризирующая тот или иной подход (или архитектуру), не заменит документ, подготовленный авторами этого подхода.
Наиболее полную информацию (спецификации, слайд-шоу, примеры, статьи и т.п.) по JDBC и другим технологиям Java читатель может получить на Web-сервере.
Поделитесь материалом с коллегами и друзьями