Metagegevens van de database extraheren met JDBC

1. Overzicht

JDBC biedt een Java-API om de feitelijke gegevens te lezen die zijn opgeslagen in databasetabellen. Daarnaast kan dezelfde API ook worden gebruikt om metadata over de database te lezen. Metagegevens zijn gegevens over de gegevens, zoals tabelnamen, kolomnamen en kolomtypen.

In deze zelfstudie leren we hoe u verschillende soorten metagegevens kunt extraheren met behulp van de DatabaseMetaData koppel.

2. DatabaseMetaData Koppel

DatabaseMetaData is een interface die verschillende methoden biedt om uitgebreide informatie over de database te verkrijgen. Deze informatie is handig voor het maken van databasetools waarmee gebruikers de structuur van verschillende databases kunnen verkennen. Het is ook handig als we willen controleren of de onderliggende database bepaalde functies ondersteunt of niet.

We hebben een exemplaar nodig van DatabaseMetaData om deze informatie te krijgen. Laten we dus in code kijken hoe we dit kunnen verkrijgen van een Verbinding voorwerp:

DatabaseMetaData databaseMetaData = connection.getMetaData ();

Hier de verbinding is een voorbeeld van JdbcConnection. Daarom getMetaData () methode retourneert een object van JdbcDatabaseMetaData, die het DatabaseMetaData koppel.

In de volgende secties zullen we dit object gebruiken om verschillende soorten metadata op te halen. Daarna leren we ook hoe we kunnen controleren of de database een bepaalde functie ondersteunt.

3. Tabellen metagegevens

Soms willen we de namen weten van alle door de gebruiker gedefinieerde tabellen, systeemtabellen of weergaven. We zouden ook graag enkele verklarende opmerkingen over de tabellen willen weten. Dit alles kan worden gedaan met behulp van de getTables () methode van de DatabaseMetaData voorwerp.

Laten we eerst eens kijken hoe we de namen van alle bestaande door de gebruiker gedefinieerde tabellen kunnen extraheren:

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

Hier zijn de eerste twee parameters catalogus en schema. De derde parameter heeft een patroon van tabelnamen. Als we bijvoorbeeld "CUST%" opgeven, omvat dit alle tabellen waarvan de naam begint met "CUST". De laatste parameter heeft een Draad array met de soorten tabellen. Gebruik TAFEL voor door de gebruiker gedefinieerde tabellen.

Als we vervolgens naar door het systeem gedefinieerde tabellen willen zoeken, hoeven we alleen maar het tabeltype te vervangen door 'SYSTEEM TABEL“:

ResultSet resultSet = databaseMetaData.getTables (null, null, null, nieuwe String [] {"SYSTEEM TABEL"}); while (resultSet.next ()) {String systemTableName = resultSet.getString ("TABLE_NAME"); }

Ten slotte, om alle bestaande weergaven te achterhalen, zouden we gewoon verander het type in "VISIE“.

4. Kolommen Metagegevens

We kunnen ook de kolommen van een bepaalde tabel extraheren met dezelfde DatabaseMetaData voorwerp. Laten we dit in actie zien:

ResultSet-kolommen = 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 de getColumns () call retourneert een ResultSet die we kunnen herhalen om de beschrijving van elke kolom te vinden. Elke beschrijving bevat veel nuttige kolommen, zoals KOLOMNAAM, COLUMN_SIZE, en DATA TYPE.

Naast gewone kolommen kunnen we ook de primaire sleutelkolommen van een bepaalde tabel achterhalen:

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

Evenzo kunnen we de beschrijving van de kolommen met externe sleutels ophalen, samen met de primaire sleutelkolommen waarnaar in de gegeven tabel wordt verwezen. Laten we een voorbeeld bekijken:

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 de KLANT ADRES tabel heeft een kolom met een externe sleutel CUST_ID dat verwijst naar het ID kaart kolom van de KLANT tafel. Het bovenstaande codefragment produceert "CUSTOMER" als de primaire tabel en "CUSTOMER_ADDRESS" als een vreemde tabel.

In het volgende gedeelte zullen we zien hoe u de informatie over de gebruikersnaam en beschikbare schemanamen kunt ophalen.

5. Metagegevens van gebruikersnaam en schema's

We kunnen ook de naam krijgen van de gebruiker wiens inloggegevens zijn gebruikt bij het ophalen van de databaseverbinding:

String userName = databaseMetaData.getUserName ();

Evenzo we kunnen de methode gebruiken getSchemas () om de namen van de beschikbare schema's op te halen in de database:

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

In de volgende sectie zullen we zien hoe we andere nuttige informatie over de database kunnen ophalen.

6. Metagegevens op databaseniveau

Laten we nu eens kijken hoe de informatie op databaseniveau kan worden verkregen met hetzelfde DatabaseMetaData voorwerp.

We kunnen bijvoorbeeld de naam en versie van het databaseproduct ophalen, de naam van het JDBC-stuurprogramma, het versienummer van het JDBC-stuurprogramma, enzovoort. Laten we nu eens kijken naar het codefragment:

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

Het kennen van deze informatie kan soms handig zijn, vooral wanneer een toepassing wordt uitgevoerd tegen meerdere databaseproducten en -versies. Een bepaalde versie of product kan bijvoorbeeld een bepaalde functie missen of een bug bevatten waarbij de toepassing een soort tijdelijke oplossing moet implementeren.

Vervolgens zullen we zien hoe we te weten kunnen komen of de database een bepaalde functie mist of ondersteunt.

7. Ondersteunde databasefuncties Metadata

Verschillende databases ondersteunen verschillende functies. H2 ondersteunt bijvoorbeeld geen volledige outer joins, terwijl MySQL dat wel doet.

Dus, hoe kunnen we erachter komen of de database die we gebruiken een bepaalde functie ondersteunt of niet? Laten we een paar voorbeelden bekijken:

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

De volledige lijst met functies die kunnen worden opgevraagd, is ook te vinden in de officiële Java-documentatie.

8. Conclusie

In dit artikel hebben we geleerd hoe u de DatabaseMetaData interface om metadata en ondersteunde functies van een database op te halen.

De volledige broncode voor het project, inclusief alle codevoorbeelden die hier worden gebruikt, is te vinden op GitHub.


$config[zx-auto] not found$config[zx-overlay] not found