Mengekstrak Metadata Pangkalan Data Menggunakan JDBC

1. Gambaran keseluruhan

JDBC menyediakan API Java untuk membaca data sebenar yang disimpan dalam jadual pangkalan data. Selain itu, API yang sama juga dapat digunakan untuk membaca metadata mengenai pangkalan data. Metadata bermaksud data mengenai data seperti nama jadual, nama lajur, dan jenis lajur.

Dalam tutorial ini, kita akan belajar cara mengekstrak pelbagai jenis metadata menggunakan antara muka DatabaseMetaData .

2. Antara Muka DatabaseMetaData

DatabaseMetaData adalah antara muka yang menyediakan pelbagai kaedah untuk mendapatkan maklumat komprehensif mengenai pangkalan data. Maklumat ini berguna untuk membuat alat pangkalan data yang membolehkan pengguna meneroka struktur pangkalan data yang berbeza. Ia juga berguna ketika kita ingin memeriksa sama ada pangkalan data yang mendasari menyokong beberapa ciri atau tidak.

Kami memerlukan contoh DatabaseMetaData untuk mendapatkan maklumat ini. Oleh itu, mari kita lihat dalam kod bagaimana kita dapat memperolehnya dari objek Sambungan :

DatabaseMetaData databaseMetaData = connection.getMetaData();

Di sini, sambungan adalah contoh JdbcConnection . Oleh itu, kaedah getMetaData () mengembalikan objek JdbcDatabaseMetaData , yang menerapkan antara muka DatabaseMetaData .

Dalam beberapa bahagian seterusnya, kami akan menggunakan objek ini untuk mengambil pelbagai jenis metadata. Selepas itu, kami juga akan belajar bagaimana memeriksa sama ada pangkalan data menyokong ciri tertentu.

3. Jadual Metadata

Kadang-kadang, kami ingin mengetahui nama semua jadual, jadual sistem atau paparan yang ditentukan pengguna. Kami juga ingin mengetahui beberapa komen penjelasan di atas jadual. Semua ini boleh dilakukan dengan menggunakan getTables () kaedah yang DatabaseMetaData objek.

Pertama, mari kita lihat bagaimana kita dapat mengekstrak nama semua jadual yang ditentukan pengguna:

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 corak nama jadual. Sebagai contoh, jika kami memberikan "CUST%", ini akan mencakup semua tabel yang namanya dimulai dengan "CUST". Parameter terakhir mengambil array String yang mengandungi jenis jadual. Gunakan TABLE untuk jadual yang ditentukan pengguna.

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

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

Akhirnya, untuk mengetahui semua paparan yang ada, kita hanya menukar jenisnya menjadi " LIHAT ".

4. Metadata Lajur

Kita juga boleh mengekstrak lajur dari jadual tertentu menggunakan objek DatabaseMetaData yang sama . Mari lihat ini dalam tindakan:

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 boleh kita lakukan untuk mencari penerangan setiap lajur. Setiap penerangan mengandungi banyak lajur berguna seperti COLUMN_NAME , COLUMN_SIZE , dan DATA_TYPE .

Selain lajur biasa, kita juga dapat mengetahui lajur utama utama dari jadual tertentu:

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

Begitu juga, kita boleh mendapatkan gambaran lajur kunci asing bersama dengan lajur kunci utama yang dirujuk oleh jadual yang diberikan. Mari lihat contoh:

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, jadual CUSTOMER_ADDRESS mempunyai lajur kunci asing CUST_ID yang merujuk lajur ID jadual PELANGGAN . Coretan kod di atas akan menghasilkan "PELANGGAN" sebagai jadual utama dan "PELANGGAN_ADDRESS" sebagai jadual asing.

Di bahagian seterusnya, kita akan melihat cara mengambil maklumat mengenai nama pengguna dan nama skema yang tersedia.

5. Nama Pengguna dan Metadata Skema

Kami juga boleh mendapatkan nama pengguna yang kelayakannya telah digunakan semasa mengambil sambungan pangkalan data:

String userName = databaseMetaData.getUserName();

Begitu juga, kita dapat menggunakan metode getSchemas () untuk mengambil nama skema yang tersedia dalam pangkalan data:

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

Di bahagian seterusnya, kita akan melihat cara mengambil beberapa maklumat berguna lain mengenai pangkalan data.

6. Metadata Tahap Pangkalan Data

Sekarang, mari kita lihat bagaimana maklumat peringkat pangkalan data dapat diperoleh menggunakan objek DatabaseMetaData yang sama .

Sebagai contoh, kita dapat mengambil nama dan versi produk pangkalan data, nama pemacu JDBC, nombor versi pemacu JDBC, dan sebagainya. Sekarang mari kita lihat coretan kod:

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

Mengetahui maklumat ini kadangkala berguna, terutamanya apabila aplikasi berjalan terhadap pelbagai produk dan versi pangkalan data. Sebagai contoh, versi atau produk tertentu mungkin tidak mempunyai fitur tertentu atau mengandung bug di mana aplikasi perlu menerapkan beberapa jenis solusi.

Selanjutnya, kita akan melihat bagaimana kita dapat mengetahui jika pangkalan data kekurangan atau menyokong ciri tertentu.

7. Metadata Ciri Pangkalan Data yang Disokong

Pangkalan data yang berbeza menyokong pelbagai ciri. Sebagai contoh, H2 tidak menyokong gabungan luar sepenuhnya, sementara MySQL tidak.

Jadi, bagaimana kita dapat mengetahui sama ada pangkalan data yang kita gunakan menyokong ciri tertentu atau tidak? Mari lihat beberapa contoh:

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

Juga, senarai lengkap ciri yang dapat ditanyakan boleh didapati di dokumentasi Java rasmi.

8. Kesimpulannya

Dalam artikel ini, kami telah belajar bagaimana menggunakan antara muka DatabaseMetaData untuk mendapatkan metadata dan ciri yang disokong dari pangkalan data.

Kod sumber lengkap untuk projek, termasuk semua contoh kod yang digunakan di sini, boleh didapati di GitHub.