Uddrag af databasemetadata ved hjælp af JDBC

1. Oversigt

JDBC leverer en Java API til at læse de faktiske data, der er gemt i databasetabeller. Udover dette kan den samme API også bruges til at læse metadata om databasen. Metadata betyder data om dataene, såsom tabelnavne, kolonnenavne og kolonnetyper.

I denne vejledning lærer vi, hvordan man udpakker forskellige typer metadata ved hjælp af DatabaseMetaData interface.

2. DatabaseMetaData Interface

DatabaseMetaData er en grænseflade, der giver en række forskellige metoder til at få omfattende oplysninger om databasen. Disse oplysninger er nyttige til oprettelse af databaseværktøjer, der giver brugerne mulighed for at udforske strukturen i forskellige databaser. Det er også nyttigt, når vi vil kontrollere, om den underliggende database understøtter nogle funktioner eller ej.

Vi har brug for en forekomst af DatabaseMetaData for at få disse oplysninger. Så lad os se i kode, hvordan vi kan få dette fra en Forbindelse objekt:

DatabaseMetaData databaseMetaData = connection.getMetaData ();

Her, den forbindelse er en forekomst af JdbcConnection. Derfor, getMetaData () metoden returnerer et objekt af JdbcDatabaseMetaData, som implementerer DatabaseMetaData interface.

I de næste par sektioner bruger vi dette objekt til at hente forskellige typer metadata. Derefter lærer vi også, hvordan vi kontrollerer, om databasen understøtter en bestemt funktion.

3. Tabeller Metadata

Nogle gange ønsker vi at kende navnene på alle brugerdefinerede tabeller, systemtabeller eller visninger. Vi kan også godt lide at vide nogle forklarende kommentarer til tabellerne. Alt dette kan gøres ved hjælp af getTables () metode til DatabaseMetaData objekt.

Lad os først se, hvordan vi kan udtrække navnene på alle eksisterende brugerdefinerede tabeller:

ResultSet resultSet = databaseMetaData.getTables (null, null, null, ny streng [] {"TABLE"}); mens (resultSet.next ()) {String tableName = resultSet.getString ("TABLE_NAME"); String bemærkninger = resultSet.getString ("BEMÆRKNINGER"); }

Her er de to første parametre katalog og skema. Den tredje parameter tager et mønster af tabelnavne. For eksempel, hvis vi angiver "CUST%", vil dette omfatte alle de tabeller, hvis navn starter med "CUST". Den sidste parameter tager en Snor array, der indeholder typerne af tabeller. Brug BORD til brugerdefinerede tabeller.

Dernæst, hvis vi vil kigge efter systemdefinerede tabeller, er alt, hvad vi skal gøre, at erstatte bordtypen med “SYSTEMTABEL“:

ResultSet resultSet = databaseMetaData.getTables (null, null, null, ny streng [] {"SYSTEMTABEL"}); mens (resultSet.next ()) {String systemTableName = resultSet.getString ("TABLE_NAME"); }

Endelig ville vi simpelthen for at finde ud af alle de eksisterende synspunkter skift type til “UDSIGT“.

4. Kolonnens metadata

Vi kan også udtrække kolonnerne i en bestemt tabel ved hjælp af den samme DatabaseMetaData objekt. Lad os se dette i aktion:

ResultSet kolonner = databaseMetaData.getColumns (null, null, "CUSTOMER_ADDRESS", null); mens (columns.next ()) {String columnName = columns.getString ("COLUMN_NAME"); Streng columnSize = columns.getString ("COLUMN_SIZE"); String datatype = columns.getString ("DATA_TYPE"); String isNullable = columns.getString ("IS_NULLABLE"); Streng isAutoIncrement = columns.getString ("IS_AUTOINCREMENT"); }

Her, den getColumns () opkald returnerer a ResultSet at vi kan gentage os for at finde beskrivelsen af ​​hver kolonne. Hver beskrivelse indeholder mange nyttige kolonner som f.eks COLUMN_NAME, COLUMN_SIZEog DATATYPE.

Udover almindelige kolonner kan vi også finde ud af de primære nøglekolonner i en bestemt tabel:

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

På samme måde kan vi hente beskrivelsen af ​​fremmede nøglekolonner sammen med de primære nøglekolonner, der henvises til i den givne tabel. Lad os se et eksempel:

ResultSet foreignKeys = databaseMetaData.getImportedKeys (null, null, "CUSTOMER_ADDRESS"); mens (foreignKeys.next ()) {String pkTableName = foreignKeys.getString ("PKTABLE_NAME"); String fkTableName = foreignKeys.getString ("FKTABLE_NAME"); Streng pkColumnName = foreignKeys.getString ("PKCOLUMN_NAME"); String fkColumnName = foreignKeys.getString ("FKCOLUMN_NAME"); }

Her, den CUSTOMER_ADDRESS tabellen har en fremmed nøglekolonne CUST_ID der henviser til ID kolonne i KUNDE bord. Ovenstående kodestykke producerer “KUNDE” som den primære tabel og “KUNDE_ADDRESS” som en fremmed tabel.

I det næste afsnit vil vi se, hvordan man henter oplysningerne om brugernavnet og de tilgængelige skemanavne.

5. Brugernavn og skema-metadata

Vi kan også få navnet på den bruger, hvis legitimationsoplysninger er blevet brugt under hentning af databaseforbindelsen:

String brugernavn = databaseMetaData.getUserName ();

Tilsvarende vi kan bruge metoden getSchemas () for at hente navnene på de tilgængelige skemaer i databasen:

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

I det næste afsnit ser vi, hvordan man henter nogle andre nyttige oplysninger om databasen.

6. Metadata på databaseniveau

Lad os nu se, hvordan oplysningerne på databaseniveau kan opnås ved hjælp af det samme DatabaseMetaData objekt.

For eksempel kan vi hente navnet og versionen af ​​databaseproduktet, navnet på JDBC-driveren, versionsnummeret på JDBC-driveren osv. Lad os nu se på kodestykket:

Streng produktnavn = databaseMetaData.getDatabaseProductName (); String productVersion = databaseMetaData.getDatabaseProductVersion (); Streng drivernavn = databaseMetaData.getDriverName (); Streng driverVersion = databaseMetaData.getDriverVersion ();

At kende disse oplysninger kan undertiden være nyttigt, især når et program kører mod flere databaseprodukter og versioner. For eksempel mangler en bestemt version eller et produkt muligvis en bestemt funktion eller indeholder en fejl, hvor applikationen skal implementere en slags løsning.

Derefter ser vi, hvordan vi kan lære at vide, om databasen mangler eller understøtter en bestemt funktion.

7. Understøttede databasefunktioner Metadata

Forskellige databaser understøtter forskellige funktioner. For eksempel understøtter H2 ikke fulde ydre sammenføjninger, mens MySQL gør det.

Så hvordan kan vi finde ud af, om den database, vi bruger, understøtter en bestemt funktion eller ej? Lad os se nogle eksempler:

boolesk supportsFullOuterJoins = databaseMetaData.supportsFullOuterJoins (); boolesk supportsStoredProcedures = databaseMetaData.supportsStoredProcedures (); boolsk supportsTransactions = databaseMetaData.supportsTransactions (); boolsk supportsBatchUpdates = databaseMetaData.supportsBatchUpdates ();

Den fulde liste over funktioner, der kan forespørges, kan også findes i den officielle Java-dokumentation.

8. Konklusion

I denne artikel har vi lært, hvordan man bruger DatabaseMetaData interface til at hente metadata og understøttede funktioner i en database.

Den komplette kildekode til projektet, inklusive alle de kodeeksempler, der bruges her, kan findes på GitHub.


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