接手陌生資料庫(如朋友公司的 "titanium" DB),無文檔、無 ER 圖,需快速掌握表結構、欄位、索引、預存程序。
Connection conn = ...; // 已建立連線
DatabaseMetaData meta = conn.getMetaData();
// 基本資訊
meta.getURL(); // 連線 URL
meta.getUserName(); // 當前用戶
meta.isReadOnly(); // 唯讀?
meta.getDatabaseProductName(); // 產品名
meta.getDatabaseProductVersion(); // 版本
meta.getDriverName(); // 驅動名
meta.getDriverVersion(); // 驅動版本
// 參數皆為 null 表示全掃描
ResultSet tables = meta.getTables(null, null, null, null);
// 類型篩選:new String[]{"TABLE", "VIEW", "SYSTEM TABLE", ...}
ResultSetMetaData rsmd = tables.getMetaData();
int cols = rsmd.getColumnCount();
// 列印標題
for (int i=1; i<=cols; i++) System.out.print(rsmd.getColumnLabel(i) + "\t");
System.out.println();
// 列印資料
while (tables.next()) {
for (int i=1; i<=cols; i++) System.out.print(tables.getString(i) + "\t");
System.out.println();
}
關鍵欄位:TABLE_CAT, TABLE_SCHEM, TABLE_NAME, TABLE_TYPE, REMARKS。
ResultSet cols = meta.getColumns(null, null, "EMPLOYEE", null);
// 比 ResultSetMetaData 更豐富:
// COLUMN_SIZE, DECIMAL_DIGITS, NUM_PREC_RADIX, COLUMN_DEF (預設值), ORDINAL_POSITION, IS_NULLABLE, ...
// 預存程序
ResultSet procs = meta.getProcedures(null, null, null);
// PROCEDURE_CAT, PROCEDURE_SCHEM, PROCEDURE_NAME, ...
// 索引
ResultSet idx = meta.getIndexInfo(null, null, "EMPLOYEE", false, true);
// TABLE_CAT, TABLE_SCHEM, TABLE_NAME, NON_UNIQUE, INDEX_QUALIFIER, INDEX_NAME, TYPE, ORDINAL_POSITION, COLUMN_NAME, ...
結合 getColumns 與 Velocity/FreeMarker 模板,可一鍵生成 JPA Entity / MyBatis Mapper / DTO 類別,消除手寫錯誤。
TABLE_NAME_PATTERN 篩選。DatabaseMetaData 是 JDBC 的「瑞士刀」,讓你在完全陌生的環境裡也能像在自家後院一樣掌握全貌。善用它,做資料庫遷移、逆向工程、文檔生成的利器。