Extrahieren von Datenbankmetadaten mit JDBC

1. Übersicht

JDBC bietet eine Java-API zum Lesen der in Datenbanktabellen gespeicherten tatsächlichen Daten. Außerdem kann dieselbe API auch zum Lesen von Metadaten über die Datenbank verwendet werden. Metadaten sind Daten zu den Daten wie Tabellennamen, Spaltennamen und Spaltentypen.

In diesem Tutorial erfahren Sie, wie Sie verschiedene Arten von Metadaten mithilfe der DatabaseMetaData- Schnittstelle extrahieren .

2. DatabaseMetaData- Schnittstelle

DatabaseMetaData ist eine Schnittstelle, die eine Vielzahl von Methoden bietet, um umfassende Informationen über die Datenbank zu erhalten. Diese Informationen sind nützlich, um Datenbank-Tools zu erstellen, mit denen Benutzer die Struktur verschiedener Datenbanken untersuchen können. Dies ist auch hilfreich, wenn Sie überprüfen möchten, ob die zugrunde liegende Datenbank einige Funktionen unterstützt oder nicht.

Wir benötigen eine Instanz von DatabaseMetaData , um diese Informationen zu erhalten. Schauen wir uns also im Code an, wie wir dies von einem Verbindungsobjekt erhalten können :

DatabaseMetaData databaseMetaData = connection.getMetaData();

Hier ist die Verbindung eine Instanz von JdbcConnection . Daher gibt die Methode getMetaData () ein Objekt von JdbcDatabaseMetaData zurück , das die DatabaseMetaData- Schnittstelle implementiert .

In den nächsten Abschnitten werden wir dieses Objekt verwenden, um verschiedene Arten von Metadaten abzurufen. Anschließend erfahren Sie, wie Sie überprüfen, ob die Datenbank eine bestimmte Funktion unterstützt.

3. Tabellen Metadaten

Manchmal möchten wir die Namen aller benutzerdefinierten Tabellen, Systemtabellen oder Ansichten kennen. Möglicherweise möchten wir auch einige erläuternde Kommentare zu den Tabellen erhalten. All dies kann mithilfe der Methode getTables () des DatabaseMetaData- Objekts erfolgen.

Lassen Sie uns zunächst sehen, wie wir die Namen aller vorhandenen benutzerdefinierten Tabellen extrahieren können:

ResultSet resultSet = databaseMetaData.getTables(null, null, null, new String[]{"TABLE"}); while(resultSet.next()) { String tableName = resultSet.getString("TABLE_NAME"); String remarks = resultSet.getString("REMARKS"); }

Hier sind die ersten beiden Parameter Katalog und Schema . Der dritte Parameter verwendet ein Muster von Tabellennamen. Wenn wir beispielsweise "CUST%" angeben, enthält dies alle Tabellen, deren Name mit "CUST" beginnt. Der letzte Parameter verwendet ein String- Array, das die Tabellentypen enthält. Verwenden Sie TABLE für benutzerdefinierte Tabellen.

Wenn wir nach systemdefinierten Tabellen suchen möchten, müssen wir lediglich den Tabellentyp durch „ SYSTEM TABLE “ ersetzen :

ResultSet resultSet = databaseMetaData.getTables(null, null, null, new String[]{"SYSTEM TABLE"}); while(resultSet.next()) { String systemTableName = resultSet.getString("TABLE_NAME"); }

Um alle vorhandenen Ansichten herauszufinden, ändern wir einfach den Typ in „ ANSICHT “.

4. Spaltenmetadaten

Wir können auch die Spalten einer bestimmten Tabelle mit demselben DatabaseMetaData- Objekt extrahieren . Lassen Sie uns dies in Aktion sehen:

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"); }

Hier gibt der Aufruf getColumns () ein ResultSet zurück , das wir iterieren können, um die Beschreibung jeder Spalte zu finden. Jede Beschreibung enthält viele nützliche Spalten wie COLUMN_NAME , COLUMN_SIZE und DATA_TYPE .

Neben regulären Spalten können wir auch die Primärschlüsselspalten einer bestimmten Tabelle ermitteln:

ResultSet primaryKeys = databaseMetaData.getPrimaryKeys(null, null, "CUSTOMER_ADDRESS"); while(primaryKeys.next()){ String primaryKeyColumnName = primaryKeys.getString("COLUMN_NAME"); String primaryKeyName = primaryKeys.getString("PK_NAME"); }

In ähnlicher Weise können wir die Beschreibung der Fremdschlüsselspalten zusammen mit den Primärschlüsselspalten abrufen, auf die in der angegebenen Tabelle verwiesen wird. Sehen wir uns ein Beispiel an:

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"); }

Hier ist die CUSTOMER_ADDRESS hat Tabelle einen Fremdschlüsselspalte CUST_ID , dass Verweise die ID - Spalte der CUSTOMER - Tabelle. Das obige Code-Snippet erzeugt "CUSTOMER" als Primärtabelle und "CUSTOMER_ADDRESS" als Fremdtabelle.

Im nächsten Abschnitt erfahren Sie, wie Sie Informationen zum Benutzernamen und den verfügbaren Schemanamen abrufen.

5. Benutzername und Schemametadaten

Wir können auch den Namen des Benutzers abrufen, dessen Anmeldeinformationen beim Abrufen der Datenbankverbindung verwendet wurden:

String userName = databaseMetaData.getUserName();

Ebenso können wir die Methode getSchemas () verwenden , um die Namen der verfügbaren Schemas in der Datenbank abzurufen :

ResultSet schemas = databaseMetaData.getSchemas(); while (schemas.next()){ String table_schem = schemas.getString("TABLE_SCHEM"); String table_catalog = schemas.getString("TABLE_CATALOG"); }

Im nächsten Abschnitt erfahren Sie, wie Sie weitere nützliche Informationen zur Datenbank abrufen.

6. Metadaten auf Datenbankebene

Lassen Sie uns nun sehen, wie die Informationen auf Datenbankebene mit demselben DatabaseMetaData- Objekt abgerufen werden können .

Beispielsweise können wir den Namen und die Version des Datenbankprodukts, den Namen des JDBC-Treibers, die Versionsnummer des JDBC-Treibers usw. abrufen. Schauen wir uns nun das Code-Snippet an:

String productName = databaseMetaData.getDatabaseProductName(); String productVersion = databaseMetaData.getDatabaseProductVersion(); String driverName = databaseMetaData.getDriverName(); String driverVersion = databaseMetaData.getDriverVersion();

Das Wissen um diese Informationen kann manchmal hilfreich sein, insbesondere wenn eine Anwendung für mehrere Datenbankprodukte und -versionen ausgeführt wird. Beispielsweise fehlt einer bestimmten Version oder einem bestimmten Produkt möglicherweise eine bestimmte Funktion oder ein Fehler, bei dem die Anwendung eine Problemumgehung implementieren muss.

Als nächstes werden wir sehen, wie wir feststellen können, ob der Datenbank eine bestimmte Funktion fehlt oder sie unterstützt.

7. Unterstützte Metadaten für Datenbankfunktionen

Unterschiedliche Datenbanken unterstützen unterschiedliche Funktionen. Beispielsweise unterstützt H2 keine vollständigen äußeren Verknüpfungen, während MySQL dies tut.

Wie können wir also herausfinden, ob die von uns verwendete Datenbank eine bestimmte Funktion unterstützt oder nicht? Sehen wir uns einige Beispiele an:

boolean supportsFullOuterJoins = databaseMetaData.supportsFullOuterJoins(); boolean supportsStoredProcedures = databaseMetaData.supportsStoredProcedures(); boolean supportsTransactions = databaseMetaData.supportsTransactions(); boolean supportsBatchUpdates = databaseMetaData.supportsBatchUpdates();

Die vollständige Liste der Funktionen, die abgefragt werden können, finden Sie in der offiziellen Java-Dokumentation.

8. Fazit

In diesem Artikel haben wir gelernt, wie Sie mithilfe der DatabaseMetaData- Schnittstelle Metadaten und unterstützte Funktionen einer Datenbank abrufen.

Den vollständigen Quellcode für das Projekt, einschließlich aller hier verwendeten Codebeispiele, finden Sie auf GitHub.