首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

Java JDBC 獲取 MySQL 元數據:表名、列名完整實戰

     編輯:MySQL 綜合教學

Java JDBC 獲取 MySQL 元數據:表名、列名完整實戰

利用 DatabaseMetaData 接口,無需手寫 SQL 即可動態獲取數據庫結構信息,適用於代碼生成器、數據字典工具、遷移校驗等場景。

核心 API 概覽

方法用途關鍵返回列
getTables()獲取表/視圖列表TABLE_NAME(3), TABLE_TYPE(4)
getColumns()獲取指定表列信息COLUMN_NAME(4), TYPE_NAME(6), COLUMN_SIZE(7)
getPrimaryKeys()獲取主鍵列COLUMN_NAME(4), KEY_SEQ(5)
getIndexInfo()獲取索引信息INDEX_NAME(6), COLUMN_NAME(9)

獲取所有用戶表名

public List<String> getAllTableNames(Connection conn, String schema) throws SQLException {
    List<String> tables = new ArrayList<>();
    try (ResultSet rs = conn.getMetaData().getTables(schema, null, "%", new String[]{"TABLE"})) {
        while (rs.next()) {
            tables.add(rs.getString("TABLE_NAME")); // 列索引 3
        }
    }
    return tables;
}

關鍵參數:

  • catalog:MySQL 中對應 schema(數據庫名),傳 null 表示當前連接庫
  • schemaPattern:MySQL 中通常傳 null
  • tableNamePattern:"%" 匹配所有
  • types:new String[]{"TABLE"} 僅獲取表,排除視圖/系統表

獲取指定表所有列名(按字母序)

public List<String> getColumnNames(Connection conn, String schema, String tableName) throws SQLException {
    List<String> columns = new ArrayList<>();
    try (ResultSet rs = conn.getMetaData().getColumns(schema, null, tableName, "%")) {
        while (rs.next()) {
            columns.add(rs.getString("COLUMN_NAME")); // 列索引 4
        }
    }
    columns.sort(String::compareToIgnoreCase); // Java 端排序
    return columns;
}

純 SQL 方案(無需 Java,適合命令行/報表)

-- 獲取指定庫所有表名
SELECT TABLE_NAME 
FROM information_schema.TABLES 
WHERE TABLE_SCHEMA = 'your_db' AND TABLE_TYPE = 'BASE TABLE'
ORDER BY TABLE_NAME;

-- 獲取指定表列名(按名排序)
SELECT COLUMN_NAME, DATA_TYPE, COLUMN_TYPE, COLUMN_COMMENT
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'your_db' AND TABLE_NAME = 'your_table'
ORDER BY ORDINAL_POSITION; -- 或 ORDER BY COLUMN_NAME

Spring Boot / JdbcTemplate 簡化寫法

@Autowired
private DataSource dataSource;

public List<String> getTables() {
    return jdbcTemplate.queryForList(
        "SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = ? AND TABLE_TYPE = 'BASE TABLE'",
        String.class, "your_db");
}

public List<Map<String, Object>> getColumns(String tableName) {
    return jdbcTemplate.queryForList(
        "SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT, COLUMN_COMMENT " +
        "FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ? ORDER BY ORDINAL_POSITION",
        "your_db", tableName);
}

實戰場景:動態建表/同步結構

// 判斷表是否存在
public boolean tableExists(Connection conn, String schema, String tableName) throws SQLException {
    try (ResultSet rs = conn.getMetaData().getTables(schema, null, tableName, new String[]{"TABLE"})) {
        return rs.next();
    }
}

// 判斷列是否存在
public boolean columnExists(Connection conn, String schema, String table, String column) throws SQLException {
    try (ResultSet rs = conn.getMetaData().getColumns(schema, null, table, column)) {
        return rs.next();
    }
}

注意事項

  1. 大小寫敏感:MySQL 在 Linux 下表名區分大小寫,getTables 返回的名稱與實際存儲一致,建議統一小寫
  2. 權限要求:需對 information_schema 有 SELECT 權限(通常默認有)
  3. 性能:元數據查詢較輕,但頻繁調用建議緩存
  4. 連接 URL 指定庫:jdbc:mysql://host:3306/your_db 可省去傳 schema 參數

掌握 DatabaseMetaData 與 information_schema 雙重技能,靈活應對各類元數據需求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved