Java获取数据库表结构

Java能够操作数据库,当然能够获取到数据库的表结构。
虽然各个DB厂商查询数据库表结构的语句不同,但是Java中通过封装,可以使用共同的API来获取。
各个具体的DB厂商有各自的实现,只需导入相应的包即可。

代码

废话不多说,直接看代码。

public static void main(String[] args) throws Exception {
    
    
   String driver = "com.mysql.cj.jdbc.Driver";
    String url = "jdbc:mysql://localhost:3306/book_sc?serverTimezone=GMT";
    String user = "root";
    String password = "root";

    printTableStructure(driver, url, user, password);
}

/**
 * 打印所有表结构
 *
 * @param driver   driver
 * @param url      url
 * @param user     user
 * @param password password
 * @throws Exception exception
 */
private static void printTableStructure(String driver, String url, String user, String password) throws Exception {
    
    
    Class.forName(driver);
    Connection connection = DriverManager.getConnection(url, user, password);

    DatabaseMetaData metaData = connection.getMetaData();
    // 获取所有表
    ResultSet tableResultSet = metaData.getTables(null, null, "order%", new String[]{
    
    "TABLE"});
    while (tableResultSet.next()) {
    
    
        String tableName = tableResultSet.getString("TABLE_NAME");
        System.out.println("table:" + tableName);

        // 获取表字段结构
        ResultSet columnResultSet = metaData.getColumns(null, "%", tableName, "%");
        while (columnResultSet.next()) {
    
    
            // 字段名称
            String columnName = columnResultSet.getString("COLUMN_NAME");
            // 数据类型
            String columnType = columnResultSet.getString("TYPE_NAME");
            // 字段长度
            int datasize = columnResultSet.getInt("COLUMN_SIZE");
            // 小数部分位数
            int digits = columnResultSet.getInt("DECIMAL_DIGITS");
            // 是否可为空 1代表可空 0代表不可为空
            int nullable = columnResultSet.getInt("NULLABLE");
            // 描述
            String remarks = columnResultSet.getString("REMARKS");
            System.out.println(columnName + " " + columnType + " " + datasize + " " + digits + " " + nullable + " " + remarks);
        }
        System.out.println("=================================");
    }
}

说明

DatabaseMetaData的getTable方法可以获取表信息,代码中获取的是 order开头的所有表,打印表名。
其中关于表,可以获得如下信息:

  • TABLE_CAT String => 表类别(可为 null)
  • TABLE_SCHEM String => 表模式(可为 null)
  • TABLE_NAME String => 表名称
  • TABLE_TYPE String => 表类型。典型的类型是 “TABLE”、“VIEW”、“SYSTEM TABLE”、“GLOBAL TEMPORARY”、“LOCAL TEMPORARY”、“ALIAS” 和 “SYNONYM”。
  • REMARKS String => 表的解释性注释
  • TYPE_CAT String => 类型的类别(可为 null)
  • TYPE_SCHEM String => 类型模式(可为 null)
  • TYPE_NAME String => 类型名称(可为 null)
  • SELF_REFERENCING_COL_NAME String => 有类型表的指定 “identifier” 列的名称(可为 null)
  • REF_GENERATION String => 指定在 SELF_REFERENCING_COL_NAME 中创建值的方式。这些值为 “SYSTEM”、“USER” 和 “DERIVED”。(可能为 null)

DatabaseMetaData的getColumns方法可以获取表字段信息,代码中分别获取其名称、类型、长度等信息。
其中关于字段,可以获得如下信息:

  • TABLE_CAT String => 表类别(可为 null)
  • TABLE_SCHEM String => 表模式(可为 null)
  • TABLE_NAME String => 表名称
  • COLUMN_NAME String => 列名称
  • DATA_TYPE int => 来自 java.sql.Types 的 SQL 类型
  • TYPE_NAME String => 数据源依赖的类型名称,对于 UDT,该类型名称是完全限定的
  • COLUMN_SIZE int => 列的大小。
  • BUFFER_LENGTH 未被使用。
  • DECIMAL_DIGITS int => 小数部分的位数。对于 DECIMAL_DIGITS 不适用的数据类型,则返回 Null。
  • NUM_PREC_RADIX int => 基数(通常为 10 或 2)
  • NULLABLE int => 是否允许使用 NULL。
  • columnNoNulls - 可能不允许使用 NULL 值
  • columnNullable - 明确允许使用 NULL 值
  • columnNullableUnknown - 不知道是否可使用 null
  • REMARKS String => 描述列的注释(可为 null)
  • COLUMN_DEF String => 该列的默认值,当值在单引号内时应被解释为一个字符串(可为 null)
  • SQL_DATA_TYPE int => 未使用
  • SQL_DATETIME_SUB int => 未使用
  • CHAR_OCTET_LENGTH int => 对于 char 类型,该长度是列中的最大字节数
  • ORDINAL_POSITION int => 表中的列的索引(从 1 开始)
  • IS_NULLABLE String => ISO 规则用于确定列是否包括 null。
  • YES — 如果参数可以包括 NULL
  • NO — 如果参数不可以包括 NULL
  • 空字符串 — 如果不知道参数是否可以包括 null
  • SCOPE_CATLOG String => 表的类别,它是引用属性的作用域(如果 DATA_TYPE 不是 REF,则为 null)
  • SCOPE_SCHEMA String => 表的模式,它是引用属性的作用域(如果 DATA_TYPE 不是 REF,则为 null)
  • SCOPE_TABLE String => 表名称,它是引用属性的作用域(如果 DATA_TYPE 不是 REF,则为 null)
  • SOURCE_DATA_TYPE short => 不同类型或用户生成 Ref 类型、来自 java.sql.Types 的 SQL 类型的源类型(如果 DATA_TYPE 不是 DISTINCT 或用户生成的 REF,则为 null)
  • IS_AUTOINCREMENT String => 指示此列是否自动增加
  • YES — 如果该列自动增加
  • NO — 如果该列不自动增加
  • 空字符串 — 如果不能确定该列是否是自动增加参数
  • COLUMN_SIZE 列表示给定列的指定列大小。对于数值数据,这是最大精度。对于字符数据,这是字符长度。对于日期时间数据类型,这是 String 表示形式的字符长度(假定允许的最大小数秒组件的精度)。对于二进制数据,这是字节长度。对于 ROWID 数据类型,这是字节长度。对于列大小不适用的数据类型,则返回 Null。

关于上述两个方法的入参,参考如下说明:

  • catalog - 类别名称;它必须与存储在数据库中的类别名称匹配;该参数为 “” 表示获取没有类别的那些描述;为 null 则表示该类别名称不应该用于缩小搜索范围
  • schemaPattern - 模式名称的模式;它必须与存储在数据库中的模式名称匹配;该参数为 “” 表示获取没有模式的那些描述;为 null 则表示该模式名称不应该用于缩小搜索范围
  • tableNamePattern - 表名称模式;它必须与存储在数据库中的表名称匹配
  • columnNamePattern - 列名称模式;它必须与存储在数据库中的列名称匹配

猜你喜欢

转载自blog.csdn.net/somehow1002/article/details/108352841
今日推荐