Mengekstrak Metadata Database Menggunakan JDBC

1. Ikhtisar

JDBC menyediakan Java API untuk membaca data aktual yang disimpan dalam tabel database. Selain itu, API yang sama juga dapat digunakan untuk membaca metadata tentang database. Metadata berarti data tentang data seperti nama tabel, nama kolom, dan tipe kolom.

Dalam tutorial ini, kita akan belajar cara mengekstrak berbagai jenis metadata menggunakan antarmuka DatabaseMetaData .

2. Antarmuka DatabaseMetaData

DatabaseMetaData merupakan antarmuka yang menyediakan berbagai metode untuk memperoleh informasi lengkap tentang database. Informasi ini berguna untuk membuat alat database yang memungkinkan pengguna untuk menjelajahi struktur database yang berbeda. Ini juga membantu ketika kita ingin memeriksa apakah database yang mendasari mendukung beberapa fitur atau tidak.

Kami memerlukan instance DatabaseMetaData untuk mendapatkan informasi ini. Jadi, mari kita lihat dalam kode bagaimana kita bisa mendapatkan ini dari objek Connection :

DatabaseMetaData databaseMetaData = connection.getMetaData();

Di sini, koneksi adalah turunan dari JdbcConnection . Oleh karena itu, metode getMetaData () mengembalikan objek JdbcDatabaseMetaData , yang mengimplementasikan antarmuka DatabaseMetaData .

Di beberapa bagian berikutnya, kita akan menggunakan objek ini untuk mengambil berbagai jenis metadata. Setelah itu, kita juga akan mempelajari cara memeriksa apakah database mendukung fitur tertentu.

3. Metadata Tabel

Terkadang, kami ingin mengetahui nama semua tabel, tabel sistem, atau tampilan yang ditentukan pengguna. Juga, kami mungkin ingin mengetahui beberapa komentar penjelasan di tabel. Semua ini bisa dilakukan dengan menggunakan metode getTables () dari objek DatabaseMetaData .

Pertama, mari kita lihat bagaimana kita bisa mengekstrak nama dari semua tabel yang ditentukan pengguna yang ada:

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

Di sini, dua parameter pertama adalah katalog dan skema . Parameter ketiga mengambil pola nama tabel. Misalnya, jika kita memberikan "CUST%", ini akan menyertakan semua tabel yang namanya dimulai dengan "CUST". Parameter terakhir mengambil array String yang berisi tipe tabel. Gunakan TABEL untuk tabel yang ditentukan pengguna.

Selanjutnya, jika kita ingin mencari tabel yang ditentukan sistem, yang harus kita lakukan adalah mengganti jenis tabel dengan " SYSTEM TABLE ":

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

Terakhir, untuk mengetahui semua tampilan yang ada, kami cukup mengubah jenisnya menjadi " LIHAT ".

4. Metadata Kolom

Kita juga bisa mengekstrak kolom dari tabel tertentu menggunakan objek DatabaseMetaData yang sama . Mari kita lihat ini beraksi:

ResultSet columns = 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"); }

Di sini, panggilan getColumns () mengembalikan ResultSet yang dapat kita iterasi untuk menemukan deskripsi setiap kolom. Setiap deskripsi berisi banyak kolom berguna seperti COLUMN_NAME , COLUMN_SIZE , dan DATA_TYPE .

Selain kolom biasa, kita juga bisa mengetahui kolom kunci utama dari tabel tertentu:

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

Demikian pula, kita dapat mengambil deskripsi kolom kunci asing bersama dengan kolom kunci utama yang direferensikan oleh tabel yang diberikan. Mari kita lihat contohnya:

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"); }

Di sini, tabel CUSTOMER_ADDRESS memiliki kolom kunci asing CUST_ID yang mereferensikan kolom ID dari tabel CUSTOMER . Potongan kode di atas akan menghasilkan "CUSTOMER" sebagai tabel utama dan "CUSTOMER_ADDRESS" sebagai tabel asing.

Di bagian selanjutnya, kita akan melihat cara mengambil informasi tentang nama pengguna dan nama skema yang tersedia.

5. Nama Pengguna dan Metadata Skema

Kita juga bisa mendapatkan nama pengguna yang kredensial telah digunakan saat mengambil koneksi database:

String userName = databaseMetaData.getUserName();

Demikian pula, kita bisa menggunakan metode getSchemas () untuk mengambil nama skema yang tersedia di database:

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

Di bagian selanjutnya, kita akan melihat cara mengambil beberapa informasi berguna lainnya tentang database.

6. Metadata Tingkat Basis Data

Sekarang, mari kita lihat bagaimana informasi tingkat database dapat diperoleh menggunakan objek DatabaseMetaData yang sama .

Misalnya, kita dapat mengambil nama dan versi produk database, nama driver JDBC, nomor versi driver JDBC, dan seterusnya. Sekarang mari kita lihat cuplikan kodenya:

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

Mengetahui informasi ini terkadang berguna, terutama saat aplikasi dijalankan pada beberapa produk dan versi database. Misalnya, versi atau produk tertentu mungkin kekurangan fitur tertentu atau mengandung bug di mana aplikasi perlu mengimplementasikan beberapa jenis solusi.

Selanjutnya, kita akan melihat bagaimana kita bisa mengetahui apakah database kekurangan atau mendukung fitur tertentu.

7. Metadata Fitur Database yang Didukung

Database yang berbeda mendukung fitur yang berbeda. Misalnya, H2 tidak mendukung gabungan luar penuh, sedangkan MySQL mendukung.

Lantas, bagaimana kita bisa mengetahui apakah database yang kita gunakan mendukung fitur tertentu atau tidak? Mari kita lihat beberapa contoh:

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

Selain itu, daftar lengkap fitur yang dapat ditanyakan dapat ditemukan di dokumentasi resmi Java.

8. Kesimpulan

Di artikel ini, kita telah mempelajari cara menggunakan antarmuka DatabaseMetaData untuk mengambil metadata dan fitur yang didukung dari database.

Kode sumber lengkap untuk proyek tersebut, termasuk semua contoh kode yang digunakan di sini, dapat ditemukan di GitHub.