Extrakcia metaúdajov databázy pomocou JDBC

1. Prehľad

JDBC poskytuje rozhranie Java API na čítanie skutočných údajov uložených v databázových tabuľkách. Okrem toho je možné rovnaké API tiež použiť na čítanie metadát o databáze. Metadáta znamenajú údaje o údajoch, ako sú názvy tabuliek, názvy stĺpcov a typy stĺpcov.

V tomto výučbe sa naučíme, ako extrahovať rôzne typy metadát pomocou DatabaseMetaData rozhranie.

2. DatabaseMetaData Rozhranie

DatabaseMetaData je rozhranie, ktoré poskytuje rôzne metódy na získanie komplexných informácií o databáze. Tieto informácie sú užitočné pri vytváraní databázových nástrojov, ktoré umožňujú používateľom preskúmať štruktúru rôznych databáz. Je to tiež užitočné, keď chceme skontrolovať, či podkladová databáza podporuje niektoré funkcie alebo nie.

Budeme potrebovať príklad DatabaseMetaData získať tieto informácie. Pozrime sa teda v kóde, ako to môžeme získať z a Pripojenie objekt:

DatabaseMetaData databaseMetaData = connection.getMetaData ();

Tu je spojenie je príkladom JdbcConnection. Preto getMetaData () metóda vracia objekt JdbcDatabaseMetaData, ktorou sa vykonáva DatabaseMetaData rozhranie.

V nasledujúcich niekoľkých častiach tento objekt použijeme na načítanie rôznych typov metadát. Ďalej sa tiež naučíme, ako skontrolovať, či databáza podporuje konkrétnu funkciu.

3. Tabuľky metadát

Niekedy chceme poznať názvy všetkých používateľom definovaných tabuliek, systémových tabuliek alebo pohľadov. Možno by nás zaujímalo niekoľko vysvetľujúcich poznámok k tabuľkám. To všetko je možné vykonať pomocou getTables () metóda DatabaseMetaData objekt.

Najprv sa pozrime, ako môžeme extrahovať názvy všetkých existujúcich používateľsky definovaných tabuliek:

ResultSet resultSet = databaseMetaData.getTables (null, null, null, nový reťazec [] {"TABLE"}); while (resultSet.next ()) {String tableName = resultSet.getString ("TABLE_NAME"); Poznámky k reťazcu = resultSet.getString ("POZNÁMKY"); }

Tu sú prvé dva parametre katalóg a schéma. Tretí parameter má vzor názvov tabuliek. Napríklad, ak poskytneme „CUST%“, bude to zahŕňať všetky tabuľky, ktorých názov začína „CUST“. Posledný parameter trvá a String pole obsahujúce typy tabuliek. Použite TABUĽKA pre tabuľky definované používateľom.

Ďalej, ak chceme hľadať systémovo definované tabuľky, musíme iba nahradiť typ tabuľky „TABUĽKA SYSTÉMU“:

ResultSet resultSet = databaseMetaData.getTables (null, null, null, nový reťazec [] {"TABUĽKA SYSTÉMU"}); while (resultSet.next ()) {String systemTableName = resultSet.getString ("TABLE_NAME"); }

Nakoniec, aby sme zistili všetky existujúce pohľady, by sme jednoducho zmeniť typ na „VYHLIADKA“.

4. Metadáta stĺpcov

Pomocou nich môžeme tiež extrahovať stĺpce konkrétnej tabuľky DatabaseMetaData objekt. Uvidíme v akcii:

ResultSet stĺpce = databaseMetaData.getColumns (null, null, "CUSTOMER_ADDRESS", null); while (columns.next ()) {String columnName = columns.getString ("COLUMN_NAME"); Reťazec columnSize = columns.getString ("COLUMN_SIZE"); Reťazec datatype = columns.getString ("DATA_TYPE"); Reťazec isNullable = columns.getString ("IS_NULLABLE"); Reťazec isAutoIncrement = columns.getString ("IS_AUTOINCREMENT"); }

Tu je getColumns () volanie vráti a Sada výsledkov že môžeme iterovať a nájsť popis každého stĺpca. Každý popis obsahuje veľa užitočných stĺpcov ako napr COLUMN_NAME, COLUMN_SIZEa DÁTOVÝ TYP.

Okrem bežných stĺpcov môžeme zistiť aj stĺpce primárneho kľúča konkrétnej tabuľky:

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

Podobne môžeme načítať popis stĺpcov cudzieho kľúča spolu so stĺpcami primárneho kľúča, na ktoré odkazuje daná tabuľka. Pozrime sa na príklad:

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

Tu je CUSTOMER_ADDRESS tabuľka má stĺpec cudzieho kľúča CUST_ID ktorý odkazuje na ID stĺpec ZÁKAZNÍK stôl. Fragment kódu uvedený vyššie vyprodukuje „ZÁKAZNÍK“ ako primárnu tabuľku a „CUSTOMER_ADDRESS“ ako zahraničnú tabuľku.

V ďalšej časti uvidíme, ako načítať informácie o používateľskom mene a dostupných názvoch schém.

5. Používateľské meno a metaúdaje schém

Môžeme tiež získať meno používateľa, ktorého poverenia boli použité pri načítaní pripojenia k databáze:

Reťazec userName = databaseMetaData.getUserName ();

Podobne môžeme použiť metódu getSchemas () vyhľadať názvy dostupných schém v databáze:

Schémy ResultSet = databaseMetaData.getSchemas (); while (schemas.next ()) {String table_schem = schemas.getString ("TABLE_SCHEM"); Reťazec table_catalog = schemas.getString ("TABLE_CATALOG"); }

V nasledujúcej časti uvidíme, ako načítať ďalšie užitočné informácie o databáze.

6. Metadáta na úrovni databázy

Teraz sa pozrime, ako je možné pomocou toho istého získať informácie na úrovni databázy DatabaseMetaData objekt.

Môžeme napríklad načítať názov a verziu databázového produktu, názov ovládača JDBC, číslo verzie ovládača JDBC atď. Pozrime sa teraz na útržok kódu:

Reťazec productName = databaseMetaData.getDatabaseProductName (); Reťazec productVersion = databaseMetaData.getDatabaseProductVersion (); Reťazec driverName = databaseMetaData.getDriverName (); Reťazec driverVersion = databaseMetaData.getDriverVersion ();

Poznanie týchto informácií môže byť niekedy užitočné, najmä ak je aplikácia spustená proti viacerým databázovým produktom a verziám. Napríklad určitej verzii alebo produktu môže chýbať konkrétna vlastnosť alebo obsahovať chybu, pri ktorej musí aplikácia implementovať nejaké riešenie.

Ďalej uvidíme, ako môžeme zistiť, či databáza neobsahuje alebo podporuje konkrétnu funkciu.

7. Podporované metaúdaje databázových funkcií

Rôzne databázy podporujú rôzne funkcie. Napríklad H2 nepodporuje úplné vonkajšie spojenia, zatiaľ čo MySQL áno.

Ako teda môžeme zistiť, či databáza, ktorú používame, podporuje určitú funkciu alebo nie? Pozrime sa na niekoľko príkladov:

boolean podporujeFullOuterJoins = databaseMetaData.supportsFullOuterJoins (); boolean podporujeStoredProcedures = databaseMetaData.supportsStoredProcedures (); boolean podporujeTransakcie = databaseMetaData.supportsTransactions (); boolean podporujeBatchUpdates = databaseMetaData.supportsBatchUpdates ();

Celý zoznam funkcií, ktoré je možné vyhľadať, nájdete tiež v oficiálnej dokumentácii Java.

8. Záver

V tomto článku sme sa naučili, ako používať DatabaseMetaData rozhranie na načítanie metadát a podporovaných funkcií databázy.

Celý zdrojový kód projektu vrátane všetkých tu použitých vzorových kódov nájdete na GitHub.


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