java.sql.DatabaseMetaData 接口提供了獲取數據庫結構信息的標準途徑:表、視圖、列、主鍵、外鍵、索引、數據類型等。本文詳細講解核心方法用法、Oracle 與 MySQL 參數差異、返回結果集分析,並提供完整可運行的工具類代碼。
Connection conn = DriverManager.getConnection(url, user, password);
DatabaseMetaData dbmd = conn.getMetaData();
ResultSet getTables(String catalog, String schema, String tableName, String[] types)
null,MySQL 為數據庫名。null。% 表示所有。{"TABLE"}、{"VIEW"}、{"TABLE","VIEW"}。常用返回列:TABLE_CAT、TABLE_SCHEM、TABLE_NAME、TABLE_TYPE、REMARKS。
ResultSet getColumns(String catalog, String schema, String tableName, String columnName)
返回列包含:COLUMN_NAME、DATA_TYPE、TYPE_NAME、COLUMN_SIZE、NULLABLE、REMARKS、COLUMN_DEF、ORDINAL_POSITION、IS_AUTOINCREMENT 等。
ResultSet getPrimaryKeys(String catalog, String schema, String tableName)
返回列:TABLE_CAT、TABLE_SCHEM、TABLE_NAME、COLUMN_NAME、KEY_SEQ、PK_NAME。必須指定 tableName。
// 獲取指定表引用的外鍵(被引用表)
ResultSet getImportedKeys(String catalog, String schema, String tableName)
// 獲取引用指定表的外鍵(引用表)
ResultSet getExportedKeys(String catalog, String schema, String tableName)
返回列包含:PKTABLE_CAT、PKTABLE_SCHEM、PKTABLE_NAME、PKCOLUMN_NAME、FKTABLE_CAT、FKTABLE_SCHEM、FKTABLE_NAME、FKCOLUMN_NAME、KEY_SEQ、UPDATE_RULE、DELETE_RULE、FK_NAME、PK_NAME、DEFERRABILITY。
ResultSet getTypeInfo()
返回當前數據庫支持的所有數據類型及其精度、字面值前後綴、是否可空等信息。
ResultSet getCatalogs() // 返回目錄名列表(TABLE_CAT)
ResultSet getSchemas() // 返回模式名列表(TABLE_SCHEM)
| 參數 | Oracle | MySQL |
|---|---|---|
| catalog | null | 數據庫名(或 null 使用連接默認庫) |
| schema | 用戶名(大寫) | null |
| tableName | 大寫表名 | 區分大小寫視配置而定 |
注意:Oracle 表名、列名、用戶名在數據字典中均存儲為大寫,查詢時必須使用大寫,否則無結果。
import java.sql.*;
import java.util.*;
public class DbMetaUtil {
private Connection conn;
public DbMetaUtil(String url, String user, String pwd) throws SQLException {
this.conn = DriverManager.getConnection(url, user, pwd);
}
// 獲取所有表名
public List getTableNames(String schema, String... types) throws SQLException {
DatabaseMetaData dbmd = conn.getMetaData();
ResultSet rs = dbmd.getTables(null, schema, "%", types.length == 0 ? new String[]{"TABLE"} : types);
List list = new ArrayList<>();
while (rs.next()) list.add(rs.getString("TABLE_NAME"));
return list;
}
// 獲取表所有列名
public List getColumnNames(String schema, String tableName) throws SQLException {
DatabaseMetaData dbmd = conn.getMetaData();
ResultSet rs = dbmd.getColumns(null, schema, tableName, "%");
List list = new ArrayList<>();
while (rs.next()) list.add(rs.getString("COLUMN_NAME"));
return list;
}
// 獲取主鍵列名
public List getPrimaryKeys(String schema, String tableName) throws SQLException {
DatabaseMetaData dbmd = conn.getMetaData();
ResultSet rs = dbmd.getPrimaryKeys(null, schema, tableName);
List list = new ArrayList<>();
while (rs.next()) list.add(rs.getString("COLUMN_NAME"));
return list;
}
// 獲取外鍵信息
public List
lower_case_table_names 設置而定。SELECT ANY DICTIONARY 或 DBA 權限。tableName 模式範圍,避免全庫掃描。ResultSetMetaData 動態獲取列名。DatabaseMetaData 是數據庫元數據編程的基石,掌握其跨數據庫差異,能構建通用的 Schema 管理、代碼生成、數據遷移等工具。