Извличане на метаданни от базата данни с помощта на JDBC

1. Общ преглед

JDBC предоставя Java API за четене на действителните данни, съхранявани в таблици на базата данни. Освен това, същият API може да се използва и за четене на метаданни за базата данни. Метаданни означава данни за данните като имена на таблици, имена на колони и типове колони.

В този урок ще научим как да извличаме различни видове метаданни с помощта на интерфейса DatabaseMetaData .

2. Интерфейс на DatabaseMetaData

DatabaseMetaData е интерфейс, който предоставя разнообразни методи за получаване на изчерпателна информация за базата данни. Тази информация е полезна за създаване на инструменти за бази данни, които позволяват на потребителите да изследват структурата на различни бази данни. Полезно е и когато искаме да проверим дали основната база данни поддържа някои функции или не.

Ще ни е необходим екземпляр на DatabaseMetaData, за да получим тази информация. И така, нека видим в кода как можем да получим това от обект Connection :

DatabaseMetaData databaseMetaData = connection.getMetaData();

Тук връзката е екземпляр на JdbcConnection . Следователно методът getMetaData () връща обект от JdbcDatabaseMetaData , който реализира интерфейса 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 . Нека да видим това в действие:

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.