1. Обзор
JDBC предоставляет API Java для чтения фактических данных, хранящихся в таблицах базы данных. Кроме того, тот же API также может использоваться для чтения метаданных о базе данных. Метаданные означают данные о данных, такие как имена таблиц, имена столбцов и типы столбцов.
В этом уроке мы узнаем, как извлекать различные типы метаданных с помощью интерфейса DatabaseMetaData .
2. Интерфейс DatabaseMetaData
DatabaseMetaData – это интерфейс, который предоставляет различные методы для получения полной информации о базе данных. Эта информация полезна для создания инструментов баз данных, которые позволяют пользователям исследовать структуру различных баз данных. Это также полезно, когда мы хотим проверить, поддерживает ли базовая база данных некоторые функции или нет.
Для получения этой информации нам понадобится экземпляр DatabaseMetaData . Итак, давайте посмотрим в коде, как мы можем получить это из объекта Connection :
DatabaseMetaData databaseMetaData = connection.getMetaData();
Здесь соединение является экземпляром Соединения Jdbc . Поэтому метод getMetadata() возвращает объект Jdbc DatabaseMetaData , который реализует интерфейс DatabaseMetaData .
В следующих нескольких разделах мы будем использовать этот объект для извлечения различных типов метаданных. Позже мы также узнаем, как проверить, поддерживает ли база данных определенную функцию.
3. Метаданные таблиц
Иногда мы хотим знать имена всех пользовательских таблиц, системных таблиц или представлений. Кроме того, мы могли бы узнать некоторые пояснительные комментарии к таблицам. Все это можно сделать с помощью метода getTables() объекта DatabaseMetaData .
Во-первых, давайте посмотрим, как мы можем извлечь имена всех существующих пользовательских таблиц:
ResultSet resultSet = databaseMetaData.getTables(null, null, null, new String[]{"TABLE"}); while(resultSet.next()) { String tableName = resultSet.getString("TABLE_NAME"); String remarks = resultSet.getString("REMARKS"); }
Здесь первыми двумя параметрами являются каталог и схема . Третий параметр принимает шаблон имен таблиц. Например, если мы предоставим “CUST%”, это будет включать все таблицы, имя которых начинается с “CUST”. Последний параметр принимает массив String , содержащий типы таблиц. Используйте TABLE для пользовательских таблиц.
Далее, если мы хотим найти системные таблицы, все, что нам нужно сделать, это заменить тип таблицы на ” СИСТЕМНАЯ ТАБЛИЦА “:
ResultSet resultSet = databaseMetaData.getTables(null, null, null, new String[]{"SYSTEM TABLE"}); while(resultSet.next()) { String systemTableName = resultSet.getString("TABLE_NAME"); }
Наконец, чтобы узнать все существующие представления, мы просто изменим тип на “ VIEW “.
4. Метаданные столбцов
Мы также можем извлечь столбцы определенной таблицы, используя тот же DatabaseMetaData object . Давайте посмотрим это в действии:
ResultSet columns = databaseMetaData.getColumns(null,null, "CUSTOMER_ADDRESS", null); while(columns.next()) { String columnName = columns.getString("COLUMN_NAME"); String columnSize = columns.getString("COLUMN_SIZE"); String datatype = columns.getString("DATA_TYPE"); String isNullable = columns.getString("IS_NULLABLE"); String isAutoIncrement = columns.getString("IS_AUTOINCREMENT"); }
Здесь вызов getColumns() возвращает ResultSet , который мы можем повторить, чтобы найти описание каждого столбца. Каждое описание содержит множество полезных столбцов, таких как COLUMN_NAME , COLUMN_SIZE и DATA_TYPE .
Помимо обычных столбцов, мы также можем узнать столбцы первичного ключа конкретной таблицы:
ResultSet primaryKeys = databaseMetaData.getPrimaryKeys(null, null, "CUSTOMER_ADDRESS"); while(primaryKeys.next()){ String primaryKeyColumnName = primaryKeys.getString("COLUMN_NAME"); String primaryKeyName = primaryKeys.getString("PK_NAME"); }
Аналогично, мы можем получить описание столбцов внешнего ключа вместе со столбцами первичного ключа, на которые ссылается данная таблица. Давайте рассмотрим пример:
ResultSet foreignKeys = databaseMetaData.getImportedKeys(null, null, "CUSTOMER_ADDRESS"); while(foreignKeys.next()){ String pkTableName = foreignKeys.getString("PKTABLE_NAME"); String fkTableName = foreignKeys.getString("FKTABLE_NAME"); String pkColumnName = foreignKeys.getString("PKCOLUMN_NAME"); String fkColumnName = foreignKeys.getString("FKCOLUMN_NAME"); }
Здесь в таблице CUSTOMER_ADDRESS есть столбец внешнего ключа CUST_ID , который ссылается на столбец ID таблицы CUSTOMER . Приведенный выше фрагмент кода создаст “CUSTOMER” в качестве основной таблицы и “CUSTOMER_ADDRESS” в качестве внешней таблицы.
В следующем разделе мы рассмотрим, как получить информацию об имени пользователя и доступных именах схем.
5. Имя пользователя и метаданные схем
Мы также можем получить имя пользователя, учетные данные которого были использованы при получении подключения к базе данных:
String userName = databaseMetaData.getUserName();
Аналогично, мы можем использовать метод getSchemas() для получения имен доступных схем в базе данных:
ResultSet schemas = databaseMetaData.getSchemas(); while (schemas.next()){ String table_schem = schemas.getString("TABLE_SCHEM"); String table_catalog = schemas.getString("TABLE_CATALOG"); }
В следующем разделе мы рассмотрим, как получить другую полезную информацию о базе данных.
6. Метаданные на Уровне Базы Данных
Теперь давайте посмотрим, как можно получить информацию на уровне базы данных, используя один и тот же объект DatabaseMetaData .
Например, мы можем получить имя и версию продукта базы данных, имя драйвера JDBC, номер версии драйвера JDBC и так далее. Давайте теперь посмотрим на фрагмент кода:
String productName = databaseMetaData.getDatabaseProductName(); String productVersion = databaseMetaData.getDatabaseProductVersion(); String driverName = databaseMetaData.getDriverName(); String driverVersion = databaseMetaData.getDriverVersion();
Знание этой информации иногда может быть полезно, особенно когда приложение работает с несколькими продуктами и версиями баз данных. Например, в определенной версии или продукте может отсутствовать определенная функция или содержаться ошибка, из-за которой приложению необходимо реализовать какой-то обходной путь.
Далее мы посмотрим, как мы можем узнать, отсутствует ли в базе данных или поддерживается определенная функция.
7. Поддерживаемые метаданные функций базы данных
Различные базы данных поддерживают различные функции. Например, H2 не поддерживает полные внешние соединения, в то время как MySQL поддерживает.
Итак, как мы можем узнать, поддерживает ли используемая нами база данных определенную функцию или нет? Давайте рассмотрим несколько примеров:
boolean supportsFullOuterJoins = databaseMetaData.supportsFullOuterJoins(); boolean supportsStoredProcedures = databaseMetaData.supportsStoredProcedures(); boolean supportsTransactions = databaseMetaData.supportsTransactions(); boolean supportsBatchUpdates = databaseMetaData.supportsBatchUpdates();
Кроме того, полный список функций, которые можно запросить, можно найти в официальной документации Java .
8. Заключение
В этой статье мы узнали, как использовать интерфейс DatabaseMetaData для извлечения метаданных и поддерживаемых функций базы данных.
Полный исходный код проекта, включая все примеры кода, используемые здесь, можно найти на GitHub .