Лекции 2025. Java. Белая / Ответы на билеты. Java
.pdf
,
,
: Эти классы являются подклассами
, но они специально адаптированы для работы с SQL-типами даты/времени.
хранит только дату (время обнуляется),
— только время (дата устанавливается на 1 января 1970).
Java 8 Date/Time API (
): Начиная с JDBC 4.2, драйверы могут поддерживать прямое отображение SQL-типов даты/времени на новые классы из
(например,
,
,
,
). Это предпочтительный способ работы с датой и временем в современных Javaприложениях. Методы
и
позволяют это делать.
и
: Эти методы являются более универсальными.
может вернуть объект Java, который наиболее точно соответствует SQL-типу столбца.
может попытаться определить SQL-тип на основе типа Java-объекта
, или можно явно указать целевой SQL-тип. Специфика драйвера: Хотя JDBC определяет стандартные маппинги, конкретный JDBC-драйвер может предоставлять дополнительные или немного отличающиеся маппинги для типов, специфичных для его СУБД.
Понимание этих соответствий типов критически важно для корректного чтения данных из
и установки параметров в
. Неправильное использование методов
/
для несоответствующих типов может привести к ошибкам преобразования (
).
79. Опишите основные этапы работы с базой данных с использованием JDBC.
Работа с базой данных с использованием JDBC обычно включает следующие основные этапы:
1. Загрузка и регистрация JDBC-драйвера (Load and Register the JDBC Driver):
Автоматическая регистрация (JDBC 4.0+): Если JDBC-драйвер (JAR-файл)
находится в classpath вашего приложения и соответствует спецификации
Service Provider Interface (SPI), он будет автоматически загружен и зарегистрирован
при первом обращении к нему (например, при вызове
). Это наиболее распространенный способ сегодня.
Ручная регистрация (устаревший способ, но иногда встречается):
загружает класс драйвера в память, и статический блок инициализации этого класса обычно регистрирует его в
.
2. Установление соединения с базой данных (Establish a Connection):
Используется класс
или интерфейс
для получения объекта
. Необходимы:
JDBC URL (строка подключения, см. вопрос 76).
Имя пользователя базы данных. Пароль пользователя базы данных.
Использование
(особенно с пулом соединений) является предпочтительным в производственных приложениях.
3. Создание объекта для выполнения SQL-запросов (Create a Statement Object):
После установления соединения создается объект для отправки SQL-запросов в базу данных. Существует три основных типа:
: Для выполнения простых статических SQL-запросов без параметров.
: Для выполнения параметризованных (предкомпилированных) SQL-запросов. Более производителен для повторяющихся запросов и безопасен от SQL-инъекций. Рекомендуется
использовать его в большинстве случаев.
: Для вызова хранимых процедур и функций базы данных.
4. Выполнение SQL-запроса (Execute the SQL Query):
Методы для выполнения запросов зависят от типа запроса и типа объекта
:

(для
) или
(для
и
): Используется для
- запросов, которые возвращают набор данных. Возвращает объект
.

(для
) или
(для
и
): Используется для
,
,
запросов, а также для DDL-команд (например, 
). Возвращает
— количество измененных строк (для DML) или 0 (для DDL).

(для
) или
(для
и
): Может выполнять любой тип
SQL-запроса. Возвращает
:
, если первый результат — это
, и
, если это количество измененных строк или нет
результатов. Для получения
или количества измененных строк используются методы
или
. Используется реже, в основном когда тип запроса заранее неизвестен.
5. Обработка результатов запроса (Process the ResultSet), если применимо:
Если запрос вернул
(обычно для
), необходимо итерироваться по нему для извлечения данных.
представляет собой таблицу данных, где курсор изначально находится перед первой строкой.
Метод
перемещает курсор на следующую строку и возвращает
, если строка существует, и
, если строк больше нет. Для получения данных из текущей строки используются методы
(например,
,
,
), которые принимают либо имя столбца, либо его порядковый номер (начиная с 1).
6. Управление транзакциями (Transaction Management), если необходимо:
По умолчанию JDBC-соединение работает в режиме автофиксации (autocommit), то есть каждый SQL-запрос выполняется как отдельная транзакция и фиксируется немедленно.
Для выполнения нескольких операций как единой атомарной транзакции необходимо:
Отключить автофиксацию: 
Выполнить SQL-операции.
Если все успешно: зафиксировать транзакцию: 
Если произошла ошибка: откатить транзакцию: 
Уровень изоляции транзакций можно установить с помощью
.
7. Закрытие JDBC-ресурсов (Close JDBC Resources):
Критически важно закрывать все JDBC-ресурсы (
,
,
,
,
) после их использования, чтобы освободить ресурсы базы данных и системные ресурсы.
Закрытие должно происходить в порядке, обратном их созданию.
Обычно это делается в блоке
(или автоматически с 
для ресурсов, реализующих
).
Эти этапы составляют основу любого взаимодействия с базой данных через JDBC.
80. Как зарегистрировать драйвер JDBC?
Существует несколько способов зарегистрировать JDBC-драйвер, чтобы
мог его использовать для установления соединений с базой данных. Выбор способа зависит от версии JDBC и предпочтений.
1. Автоматическая регистрация (JDBC 4.0 и выше) - Рекомендуемый способ:
Принцип: Начиная с JDBC 4.0, драйверы, соответствующие спецификации SPI (Service Provider Interface), могут быть автоматически обнаружены и зарегистрированы
без явного кода со стороны программиста.
Как это работает:
JAR-файл JDBC-драйвера должен содержать файл 
.
Этот файл должен содержать полное имя класса (или классов, если их несколько, каждый на новой строке), реализующего интерфейс
.
Когда
инициализируется (например, при первом вызове
или другого его метода), он просматривает classpath на наличие таких файлов и автоматически загружает и регистрирует указанные классы драйверов.
Что нужно сделать программисту: Просто убедиться, что JAR-файл JDBC-
драйвера находится в classpath вашего приложения во время выполнения. Никакого дополнительного кода для регистрации не требуется.
Пример (концептуально, код не нужен):
Если у вас в
(для Maven) или
(для Gradle) добавлена зависимость на JDBC-драйвер, например:
При сборке и запуске приложения этот JAR будет в classpath, и драйвер зарегистрируется автоматически.
2.Явная загрузка класса драйвера с помощью
(Устаревший, но рабочий способ, для JDBC < 4.0 или для специфических случаев):
Принцип: Явно загрузить класс JDBC-драйвера в память с помощью
.
Как это работает: Большинство JDBC-драйверов в своем статическом блоке инициализации (
) содержат код для регистрации экземпляра самого себя в
с помощью 
. Когда класс загружается через
, этот статический блок выполняется.
Что нужно сделать программисту:
Недостатки:
Создает прямую зависимость от конкретного класса драйвера в коде.
Менее гибко, если нужно легко менять драйверы.
Требует обработки
.
Хотя этот способ считается устаревшим для большинства современных приложений (где JDBC 4.0+ является стандартом), он все еще может встречаться в старом коде или в ситуациях, когда автоматическая регистрация по какой-то причине не срабатывает.
3.Явная регистрация с помощью
(Редко используется напрямую):
Принцип: Создать экземпляр класса драйвера и явно передать его методу
.
Что нужно сделать программисту:
Недостатки:
Еще более явная зависимость от класса драйвера. Требует обработки
при регистрации.
Обычно не нужен, так как сам драйвер делает это в своем статическом блоке при загрузке через
или автоматически.
Также существует метод
для удаления драйвера из списка.
Рекомендация:
В современных Java-приложениях (Java 6 и выше, где JDBC 4.0 является частью стандарта) предпочтительным и наиболее простым способом является автоматическая регистрация драйверов. Просто убедитесь, что JAR-файл драйвера находится в classpath.
Если вы работаете со старым кодом или специфической средой, где автоматическая регистрация не работает,
является следующим вариантом. Прямой вызов
обычно не требуется.
81. Как установить соединение с базой данных?
Установление соединения с базой данных — это первый практический шаг после загрузки/регистрации JDBC-драйвера. Соединение представлено объектом интерфейса
.
Существует два основных способа получения объекта
:
1. Использование
(традиционный способ):
Класс
управляет набором JDBC-драйверов и предоставляет статические методы
для установления соединения.
Необходимые компоненты:
1.JDBC URL: Строка, указывающая на базу данных (см. вопрос 76).
2.Имя пользователя (Username): Учетные данные для доступа к БД.
3.Пароль (Password): Учетные данные для доступа к БД.
Методы
:
: JDBC URL должен содержать всю необходимую информацию, включая пользователя и пароль (если они передаются как параметры URL, что зависит от драйвера и не всегда безопасно).
: Наиболее распространенный способ, где URL, имя пользователя и пароль передаются как отдельные аргументы.
: Позволяет передать URL и дополнительные свойства подключения (включая пользователя и пароль) в объекте
.
Пример:
2.Использование
(предпочтительный способ в корпоративных и управляемых средах):
— это интерфейс, который представляет собой фабрику для соединений с физическим источником данных.
Преимущества перед
:
Абстракция: Скрывает детали подключения (URL, имя драйвера) от прикладного кода. Конфигурация
обычно выполняется отдельно (например, через JNDI на сервере приложений, в конфигурационных файлах Spring).
Пул соединений (Connection Pooling):
часто реализуется с использованием пула соединений. Пул соединений — это кеш уже установленных соединений с БД, которые могут переиспользоваться. Это значительно повышает производительность, так как установление нового соединения — ресурсоемкая операция.
Распределенные транзакции (Distributed Transactions): 
может участвовать в распределенных транзакциях (например, с
использованием JTA - Java Transaction API).
Как получить
:
На сервере приложений (Java EE / Jakarta EE): Обычно настраивается администратором сервера и получается приложением через JNDI (Java
