Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лекции 2025. Java. Белая / Ответы на билеты. Java

.pdf
Скачиваний:
4
Добавлен:
02.01.2026
Размер:
4.52 Mб
Скачать

, , : Эти классы являются подклассами , но они специально адаптированы для работы с 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