Utpakking av databasemetadata ved bruk av JDBC

1. Oversikt

JDBC tilbyr et Java API for å lese de faktiske dataene som er lagret i databasetabeller. I tillegg til dette kan samme API også brukes til å lese metadata om databasen. Metadata betyr data om dataene, for eksempel tabellnavn, kolonnenavn og kolonnetyper.

I denne opplæringen lærer vi hvordan vi trekker ut forskjellige typer metadata ved hjelp av DatabaseMetaData grensesnitt.

2. DatabaseMetaData Grensesnitt

DatabaseMetaData er et grensesnitt som gir en rekke metoder for å få omfattende informasjon om databasen. Denne informasjonen er nyttig for å lage databaseverktøy som lar brukerne utforske strukturen til forskjellige databaser. Det er også nyttig når vi vil sjekke om den underliggende databasen støtter noen funksjoner eller ikke.

Vi trenger en forekomst av DatabaseMetaData for å få denne informasjonen. Så la oss se i kode hvordan vi kan få dette fra a Forbindelse gjenstand:

DatabaseMetaData databaseMetaData = connection.getMetaData ();

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

I de neste avsnittene bruker vi dette objektet til å hente forskjellige typer metadata. Etterpå lærer vi også hvordan du sjekker om databasen støtter en bestemt funksjon.

3. Tabeller Metadata

Noen ganger vil vi vite navnene på alle brukerdefinerte tabeller, systemtabeller eller visninger. Vi vil kanskje også vite noen forklarende kommentarer til bordene. Alt dette kan gjøres ved å bruke getTables () metoden for DatabaseMetaData gjenstand.

La oss først se hvordan vi kan trekke ut navnene på alle eksisterende brukerdefinerte tabeller:

ResultSet resultSet = databaseMetaData.getTables (null, null, null, ny streng [] {"TABLE"}); while (resultSet.next ()) {String tableName = resultSet.getString ("TABLE_NAME"); String bemerkninger = resultSet.getString ("BEMERKNINGER"); }

Her er de to første parametrene katalog og skjema. Den tredje parameteren tar et mønster av tabellnavn. For eksempel, hvis vi oppgir "CUST%", vil dette inkludere alle tabellene hvis navn starter med "CUST". Den siste parameteren tar en String matrise som inneholder typene tabeller. Bruk BORD for brukerdefinerte tabeller.

Deretter, hvis vi vil se etter systemdefinerte tabeller, er alt vi trenger å gjøre å erstatte tabelltypen med “SYSTEMTABELL“:

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

Til slutt, for å finne ut alle eksisterende synspunkter, ville vi ganske enkelt endre typen til “UTSIKT“.

4. Kolonnemetadata

Vi kan også trekke ut kolonnene i en bestemt tabell ved å bruke den samme DatabaseMetaData gjenstand. La oss se dette i aksjon:

ResultSet kolonner = databaseMetaData.getColumns (null, null, "CUSTOMER_ADDRESS", null); while (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 () samtale returnerer a ResultatSett at vi kan gjenta for å finne beskrivelsen av hver kolonne. Hver beskrivelse inneholder mange nyttige kolonner som COLUMN_NAME, COLUMN_SIZE, og DATA-TYPE.

I tillegg til vanlige kolonner, kan vi også finne ut de viktigste nøkkelkolonnene i en bestemt tabell:

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åte kan vi hente beskrivelsen av utenlandske nøkkelkolonner sammen med de primære nøkkelkolonnene det er gitt i den gitte tabellen. La oss 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 utenlandsk nøkkelkolonne CUST_ID som refererer til ID kolonnen i KUNDE bord. Ovennevnte kodebit produserer “KUNDE” som primærtabell og “KUNDE_ADDRESS” som fremmed tabell.

I neste avsnitt vil vi se hvordan du henter informasjonen om brukernavnet og tilgjengelige skjemanavn.

5. Brukernavn og skjemametadata

Vi kan også få navnet på brukeren hvis legitimasjon har blitt brukt mens du henter databasetilkoblingen:

String brukernavn = databaseMetaData.getUserName ();

På samme måte, vi kan bruke metoden getSchemas () for å hente navnene på tilgjengelige skjemaer i databasen:

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

I neste avsnitt ser vi hvordan du kan hente annen nyttig informasjon om databasen.

6. Metadata på databasenivå

La oss nå se hvordan informasjonen på databasenivå kan oppnås ved å bruke det samme DatabaseMetaData gjenstand.

For eksempel kan vi hente navnet og versjonen av databaseproduktet, navnet på JDBC-driveren, versjonsnummeret til JDBC-driveren og så videre. La oss nå se på kodebiten:

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

Å vite denne informasjonen kan noen ganger være nyttig, spesielt når et program kjører mot flere databaseprodukter og versjoner. For eksempel kan en bestemt versjon eller et produkt mangle en bestemt funksjon eller inneholde en feil der applikasjonen trenger å implementere en slags løsning.

Deretter ser vi hvordan vi kan bli kjent med om databasen mangler eller støtter en bestemt funksjon.

7. Støttede databasefunksjoner Metadata

Ulike databaser støtter forskjellige funksjoner. For eksempel støtter ikke H2 full ytre sammenføyninger, mens MySQL gjør det.

Så hvordan kan vi finne ut om databasen vi bruker støtter en bestemt funksjon eller ikke? La oss se noen eksempler:

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

Den komplette listen over funksjoner som kan spørres, finner du også i den offisielle Java-dokumentasjonen.

8. Konklusjon

I denne artikkelen har vi lært hvordan du bruker DatabaseMetaData grensesnitt for å hente metadata og støttede funksjoner i en database.

Den komplette kildekoden for prosjektet, inkludert alle kodeeksemplene som brukes her, finner du på GitHub.


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