Модуль 5 Рассматриваемые темы: Метаданные Групповая модификация данных Вопросы типизации Дополнительные возможности JDBC API слайд 5-1
Дополнительные возможности Метаданные – это информация о данных в БД и возможностях СУБД Метаданные включают в себя: Информацию о схеме БД Информацию о возможностях БД Без использования метаданных невозможно построить действительно переносимого клиента слайд 5-2 Метаданные, или метаинформация
Дополнительные возможности Метаданные представлены в JDBC API 2 двумя интерфейсами: DatabaseMetaData ResultSetMetaData Оба варианта содержат огромное количество информации слайд 5-3 Использование метаданных в JDBC API
Дополнительные возможности Для получения объектов метаданных следует воспользоваться методами: DatabaseMetaData Connection.getMetaData() ResultSetMetaData ResultSet.getMetaData() слайд 5-4 Использование метаданных в JDBC API
Получение списка таблиц String catalog = null; String schemaPattern = null; String tableNamePattern = null; String[] types = null; ResultSet result = databaseMetaData.getTables( catalog, schemaPattern, tableNamePattern, types ); while(result.next()) { String tableName = result.getString(3); }
Получение списка колонок String catalog = null; String schemaPattern = null; String tableNamePattern = "my_table"; String columnNamePattern = null; ResultSet result = databaseMetaData.getColumns( catalog, schemaPattern, tableNamePattern, columnNamePattern); while(result.next()){ String columnName = result.getString(4); int columnType = result.getInt(5); }
Дополнительные возможности Часто востребованная информация о базе: Информация о схеме БД Какие типы данных использует СУБД Какие уровни изоляции транзакций поддерживает СУБД Поддерживает ли СУБД групповую модификацию Какие специфические SQL-выражения поддерживает СУБД Под каким пользователем произведен вход слайд 5-7 Метаданные базы, DatabaseMetaData
Дополнительные возможности слайд 5-8 Метаданные выборки, ResultSetMetaData Метаданные выборки – подмножество метаданных базы Только информация о схеме БД, которая участвовала в выборке
Дополнительные возможности слайд 5-9 Выводы по метаданным Метаданные необходимо использовать для построения действительно переносимого клиента БД Метаданные предоставляют исчерпывающую информацию о схеме БД и о возможностях СУБД
Дополнительные возможности Рассматриваемые темы: Метаданные Групповая модификация данных Вопросы типизации слайд 5-10
SQL-запросы к СУБД SQL-выражения, модифицирующие данные ( INSERT, UPDATE, DELETE ), упаковываются в один пакет и пересылаются на сервер БД для выполнения Это дает выигрыш в производительности по сравнению с несколькими независимыми запросами слайд 5-11 Групповая модификация данных
SQL-запросы к СУБД Интерфейс Statement предлагает методы работы с batch-update: void addBatch(String sql) void clearBatch() int[] executeBatch() возвращает массив статусов выполнения модификаций данных слайд 5-12 Групповая модификация данных
SQL-запросы к СУБД Для ускорения работы групповых обновлений рекомендуется явно начинать транзакцию и явно завершать её после группового обновления Чем не устраивает auto-commit? слайд 5-13 Групповая модификация данных
SQL-запросы к СУБД Проверить поддержку batch-update Создать Connection и Statement Отключить auto-commit Добавить одно или несколько SQL-выражений в Statement методом addBatch() Запустить группу на выполнение методом executeBatch() Проверить ошибки и предупреждения Подтверждение транзакции Проанализировать результаты слайд 5-14 Алгоритм групповой модификации данных
SQL-запросы к СУБД Групповая модификация данных хорошо сочетается с подготовленными запросами Не все сервера БД поддерживают групповую модификацию данных. Необходимо анализировать метаинформацию слайд 5-15 Групповая модификация данных
SQL-запросы к СУБД слайд 5-16 Пример групповой модификации данных connection.setAutoCommit( false ); try { statement.addBatch( INSERT INTO employees VALUES (1000, 'Joe Jones') ); statement.addBatch( INSERT INTO departments VALUES (260, 'Shoe') ); statement.addBatch( INSERT INTO emp_dept VALUES (1000, '260') ); int [] updateCounts = statement.executeBatch(); } catch( BatchUpdateException b ) { System.err.println( "Update counts of successful commands: " ); int [] updateCounts = b.getUpdateCounts(); for (int i = 0; i < updateCounts.length; i ++) System.err.print(updateCounts[i] + " "); } con.commit(); MyDBClient.java
SQL-запросы к СУБД Групповую модификацию следует использовать для повышения производительности Групповая модификация данных хорошо сочетается с подготовленными запросами Не все сервера БД поддерживают групповую модификацию данных, необходимо анализировать метаинформацию слайд 5-17 Выводы по групповой модификации
Дополнительные возможности Рассматриваемые темы: Метаданные Групповая модификация данных Вопросы типизации слайд 5-18
SQL-запросы к СУБД Как отобразить SQL-тип данных на Java-тип при снятии значения поля при анализе выборки? Особенно, с учетом того, что многие СУБД имею нестандартные типы? Типизация значений полей слайд 5-19
SQL-запросы к СУБД Проблема 1. Различные имена схожих типов в различных СУБД JDBC объявляет набор базовых типов SQL в классе java.sql.Types как static- константы Если необходимо сформировать SQL- запрос, где имя типа должно быть в виде строки, стоит воспользоваться метаинформацией СУБД Типизация значений полей слайд 5-20
SQL-запросы к СУБД Проблема 2. Тип не известен на этапе компиляции JDBC предлагает методы: ResultSet.getObject() PreparedStatement.setObject() CallableStatement.getObject() Тип java.sql.Types.OTHER Далее необходимо run-time приведение типов Типизация значений полей слайд 5-21
SQL-запросы к СУБД Проблема 3. Соответствие типов Java и SQL JDBC регламентирует отображение примитивных (методы setXXX() и getXXX() ) и объектных (методы setObject() и getObject() ) типов Java на типы SQL и обратно Но это зависит от производителя слайд 5-22 Типизация значений полей
Дополнительные возможности Рассмотренные темы: Метаданные Групповая модификация данных Вопросы типизации слайд 5-23