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 – 列名称模式;它必须与存储在数据库中的列名称匹配