Izdvajanje metapodataka baze podataka pomoću JDBC

1. Pregled

JDBC nudi Java API za čitanje stvarnih podataka pohranjenih u tablicama baze podataka. Osim toga, isti API se također može koristiti za čitanje metapodataka o bazi podataka. Metapodaci znače podatke o podacima kao što su nazivi tablica, nazivi stupaca i vrste stupaca.

U ovom uputstvu naučit ćemo kako izvući različite vrste metapodataka pomoću DatabaseMetaData sučelje.

2. DatabaseMetaData Sučelje

DatabaseMetaData je sučelje koje pruža razne metode za dobivanje sveobuhvatnih podataka o bazi podataka. Te su informacije korisne za stvaranje alata baze podataka koji omogućuju korisnicima da istraže strukturu različitih baza podataka. Korisno je i kada želimo provjeriti podržava li osnovna baza podataka neke značajke ili ne.

Trebat će nam primjerak DatabaseMetaData da biste dobili ove podatke. Pa, pogledajmo u kodu kako to možemo dobiti od a Veza objekt:

DatabaseMetaData databaseMetaData = connection.getMetaData ();

Evo, povezanost je instanca JdbcConnection. Stoga, getMetaData () metoda vraća objekt od JdbcDatabaseMetaData, koji provodi DatabaseMetaData sučelje.

U sljedećih nekoliko odjeljaka koristit ćemo ovaj objekt za dohvaćanje različitih vrsta metapodataka. Poslije ćemo naučiti i kako provjeriti podržava li baza podataka određenu značajku.

3. Tablice Metapodaci

Ponekad želimo znati imena svih korisnički definiranih tablica, sistemskih tablica ili pogleda. Također, možda bismo željeli znati neke komentare s objašnjenjima na tablicama. Sve se to može učiniti pomoću getTables () metoda DatabaseMetaData objekt.

Prvo, pogledajmo kako možemo izvući imena svih postojećih korisnički definiranih tablica:

ResultSet resultSet = databaseMetaData.getTables (null, null, null, new String [] {"TABELA"}); while (resultSet.next ()) {StringName tablice = resultSet.getString ("TABLE_NAME"); String napomene = resultSet.getString ("NAPOMENE"); }

Ovdje su prva dva parametra katalog i shema. Treći parametar uzima obrazac imena tablica. Na primjer, ako pružimo "CUST%", to će uključivati ​​sve tablice čiji naziv počinje s "CUST". Posljednji parametar uzima a Niz niz koji sadrži tipove tablica. Koristiti STOL za korisnički definirane tablice.

Dalje, ako želimo tražiti sistemski definirane tablice, sve što moramo učiniti je zamijeniti tip tablice s “TABELA SUSTAVA“:

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

Napokon, jednostavno bismo saznali sve postojeće poglede promijenite tip u "POGLED“.

4. Metapodaci stupaca

Također možemo izvući stupce određene tablice koristeći iste DatabaseMetaData objekt. Pogledajmo ovo na djelu:

ResultSet stupci = databaseMetaData.getColumns (null, null, "CUSTOMER_ADDRESS", null); while (columns.next ()) {StringName stupca = columns.getString ("COLUMN_NAME"); Niz columnSize = columns.getString ("COLUMN_SIZE"); Niz podataka vrsta = stupci.getString ("DATA_TYPE"); String isNullable = columns.getString ("IS_NULLABLE"); String isAutoIncrement = columns.getString ("IS_AUTOINCREMENT"); }

Evo, getColumns () poziv se vraća a Postavi rezultat da možemo ponoviti pronalazak opisa svakog stupca. Svaki opis sadrži mnogo korisnih stupaca poput COLUMN_NAME, COLUMN_SIZE, i VRSTA PODATAKA.

Osim redovnih stupaca, možemo pronaći i stupce primarnih ključeva određene tablice:

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

Slično tome, možemo doći do opisa stupaca stranog ključa zajedno sa stupcima primarnog ključa na koje se poziva navedena tablica. Pogledajmo primjer:

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

Evo, ADRESA KUPCA tablica ima stupac stranog ključa CUST_ID koji upućuje na iskaznica stupac KUPAC stol. Gornji isječak koda stvorit će "CUSTOMER" kao primarnu tablicu, a "CUSTOMER_ADDRESS" kao stranu tablicu.

U sljedećem odjeljku vidjet ćemo kako dohvatiti informacije o korisničkom imenu i dostupnim imenima sheme.

5. Korisničko ime i metapodaci shema

Također možemo dobiti ime korisnika čije su vjerodajnice korištene prilikom dohvaćanja veze s bazom podataka:

Niz userName = databaseMetaData.getUserName ();

Slično tome, možemo koristiti metodu getSchemas () za dohvaćanje naziva dostupnih shema u bazi podataka:

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

U sljedećem ćemo odjeljku vidjeti kako dohvatiti neke druge korisne informacije o bazi podataka.

6. Metapodaci na razini baze podataka

Pogledajmo sada kako se informacije na razini baze podataka mogu dobiti pomoću istih DatabaseMetaData objekt.

Na primjer, možemo dohvatiti ime i verziju proizvoda baze podataka, naziv JDBC pokretačkog programa, broj verzije JDBC pokretačkog programa i tako dalje. Pogledajmo sada isječak koda:

Niz proizvodaName = baza podatakaMetaData.getDatabaseProductName (); String productVersion = databaseMetaData.getDatabaseProductVersion (); Niz ime vozača = databaseMetaData.getDriverName (); Niz driverVersion = databaseMetaData.getDriverVersion ();

Poznavanje ovih informacija ponekad može biti korisno, posebno kada se aplikacija izvodi protiv više proizvoda i verzija baze podataka. Na primjer, određenoj verziji ili proizvodu može nedostajati određena značajka ili sadržavati programsku pogrešku u kojoj aplikacija treba implementirati neku vrstu zaobilaženja.

Zatim ćemo vidjeti kako možemo saznati nedostaje li baza podataka ili podržava određenu značajku.

7. Podržani metapodaci značajki baze podataka

Različite baze podataka podržavaju različite značajke. Na primjer, H2 ne podržava potpuno vanjsko spajanje, dok MySQL to podržava.

Pa, kako možemo saznati podržava li baza podataka koju koristimo određenu značajku ili ne? Pogledajmo nekoliko primjera:

logička podrškaFullOuterJoins = databaseMetaData.supportsFullOuterJoins (); logička podrškaStoredProcedures = databaseMetaData.supportsStoredProcedures (); logička podrškaTransaction = databaseMetaData.supportsTransactions (); boolean supportsBatchUpdates = databaseMetaData.supportsBatchUpdates ();

Također, puni popis značajki koje se mogu ispitati nalazi se u službenoj Java dokumentaciji.

8. Zaključak

U ovom smo članku naučili kako koristiti DatabaseMetaData sučelje za preuzimanje metapodataka i podržanih značajki baze podataka.

Kompletni izvorni kod za projekt, uključujući sve ovdje korištene uzorke koda, možete pronaći na GitHubu.