首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

[JAVA100例] 第56例:JDBC 數據庫元數據——DatabaseMetaData 獲取庫表結構

     編輯:Java 相關知識

本例演示使用 DatabaseMetaData 獲取數據庫級元數據:驅動信息、URL、最大行大小、所有表信息、主鍵、外鍵詳情。

核心代碼

public class JDBCDataMeta {
  private String url, username, password;

  public static void main(String[] args) {
    if (args.length != 4) { System.out.println("use: java JDBCDataMeta url username password tablename"); return; }
    JDBCDataMeta JDM = new JDBCDataMeta();
    JDM.url = args[0]; JDM.username = args[1]; JDM.password = args[2];
    JDM.getMeta(JDM.conn(), args[3]);
  }

  public Connection conn() { ... }  // 同前例

  public void getMeta(Connection con, String table) {
    try {
      DatabaseMetaData dbmd = con.getMetaData();
      
      // 1. 驅動與連接信息
      System.out.println("dataName=" + dbmd.getDriverName());
      System.out.println("dataURL=" + dbmd.getURL());
      System.out.println("dataMaxSize=" + dbmd.getMaxRowSize());

      // 2. 所有表信息
      String[] types = {"TABLE"};
      ResultSet results = dbmd.getTables(null, null, "%", types);
      while (results.next()) {
        System.err.println("TABLE_CAT:" + results.getObject(1));
        System.err.println("TABLE_SCHEM:" + results.getObject(2));
        System.err.println("TABLE_NAME:" + results.getObject(3));
        System.err.println("TABLE_TYPE:" + results.getObject(4));
        System.err.println("REMARKS:" + results.getObject(5));
      }

      // 3. 指定表主鍵
      ResultSet pkRSet = dbmd.getPrimaryKeys(null, null, table);
      while (pkRSet.next()) {
        System.err.println("PK_TABLE_NAME:" + pkRSet.getObject(3));
        System.err.println("PK_COLUMN_NAME:" + pkRSet.getObject(4));
        System.err.println("KEY_SEQ:" + pkRSet.getObject(5));
        System.err.println("PK_NAME:" + pkRSet.getObject(6));
      }

      // 4. 指定表外鍵(被引用)
      results = dbmd.getImportedKeys(null, null, table);
      while (results.next()) {
        System.err.println("FKTABLE_NAME:" + results.getObject(7));
        System.err.println("FKCOLUMN_NAME:" + results.getObject(8));
        System.err.println("PKTABLE_NAME:" + results.getObject(3));
        System.err.println("PKCOLUMN_NAME:" + results.getObject(4));
        System.err.println("FK_NAME:" + results.getObject(12));
      }
    } catch (SQLException se) { se.printStackTrace(); }
    catch (Exception e) { System.out.println(e); }
    finally { try { con.close(); } catch (SQLException se) {} }
  }
}

DatabaseMetaData 核心分類

類別代表方法用途
數據庫信息getDriverName、getURL、getDatabaseProductName/Version、getMaxRowSize連接環境檢測、兼容性適配
表/視圖getTables、getTableTypes、getTablePrivilegesSchema 瀏覽、代碼生成
列定義getColumns、getColumnPrivileges字段詳情、動態表單
主鍵getPrimaryKeys、getBestRowIdentifier實體 ID 映射、關聯構建
外鍵getImportedKeys(被引用)、getExportedKeys(引用他表)、getCrossReference關係圖譜、級聯操作
索引getIndexInfo性能分析、優化建議
存儲過程getProcedures、getProcedureColumnsCallableStatement 參數綁定
功能支持supportsTransactions、supportsBatchUpdates、supportsANSI92EntryLevelSQL 等跨數據庫兼容性判斷

關鍵方法參數說明

  • getTables(catalog, schemaPattern, tableNamePattern, types[]):模式匹配支援 % (任意字符)、_ (單字符)
  • getPrimaryKeys/ImportedKeys/ExportedKeys(catalog, schema, table):catalog/schema 可為 null 表示全部
  • 返回 ResultSet 列名固定(如 TABLE_CAT、TABLE_SCHEM、TABLE_NAME...),建議用列名獲取而非索引

應用場景

  • 數據庫建模工具/ER 圖自動生成
  • 代碼生成器(MyBatis Generator、JPA 實體生成)
  • 數據遷移工具(Schema 對比、同步腳本生成)
  • 通用數據庫瀏覽器/管理控制台
  • 運行期兼容性檢測(動態適配不同數據庫方言)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved