最近在编写 KUTILS 的时候,需要通过JDBC
抓取数据库的字段的数据类型、字段名称、字段注释,字段长度,字段精度等信息,这里记录下一些经常会使用到的信息。
public class TableInfoLoaderTest {
private Connection connection;
private Logger logger = LoggerFactory.getLogger(this.getClass());
@Before
public void before() {
DataSourceInfo dataSource = new DataSourceInfo();
dataSource.setDriver("com.mysql.jdbc.Driver");
dataSource.setUsername("root");
dataSource.setPassword("Ab123456");
dataSource.setUrl("jdbc:mysql://192.168.120.22:3306/activity?characterEncoding=UTF-8");
connection = ConnectionUtil.getConnection(dataSource);
}
@Test
public void testQueryDataInfo() {
String table = "activity_info";
try {
DatabaseMetaData metaData = connection.getMetaData();
ResultSet rs = metaData.getColumns(connection.getCatalog(), "%", table, "%");
while (rs.next()) {
System.out.println();
logger.info("列名称:\t{}", rs.getString(ResultSetColumnKeys.COLUMN_NAME.name()));
logger.info("java.sql.Types:\t{}", rs.getString(ResultSetColumnKeys.DATA_TYPE.name()));
logger.info("字段类型:\t{}", rs.getString(ResultSetColumnKeys.TYPE_NAME.name()));
logger.info("列的大小:\t{}", rs.getString(ResultSetColumnKeys.COLUMN_SIZE.name()));
logger.info("小数部分的位数:\t{}", rs.getString(ResultSetColumnKeys.DECIMAL_DIGITS.name()));
logger.info("基数:\t{}", rs.getString(ResultSetColumnKeys.NUM_PREC_RADIX.name()));
logger.info("描述列的注释:\t{}", rs.getString(ResultSetColumnKeys.REMARKS.name()));
logger.info("该列的默认值:\t{}", rs.getString(ResultSetColumnKeys.COLUMN_DEF.name()));
logger.info("列中的最大字节数:\t{}", rs.getString(ResultSetColumnKeys.CHAR_OCTET_LENGTH.name()));
logger.info("列的索引:\t{}", rs.getString(ResultSetColumnKeys.ORDINAL_POSITION.name()));
logger.info("是否允许使用 NULL:\t{}", rs.getString(ResultSetColumnKeys.IS_NULLABLE.name()));
logger.info("指示此列是否自动增加:\t{}", rs.getString(ResultSetColumnKeys.IS_AUTOINCREMENT.name()));
}
rs.close();
} catch (SQLException e) {
throw new RuntimeException("表信息抽取异常!", e);
}
}
}
logger.info.TableInfoLoaderTest - 列名称: id
logger.info.TableInfoLoaderTest - java.sql.Types: -5
logger.info.TableInfoLoaderTest - 字段类型: BIGINT
logger.info.TableInfoLoaderTest - 列的大小: 19
logger.info.TableInfoLoaderTest - 小数部分的位数: 0
logger.info.TableInfoLoaderTest - 基数: 10
logger.info.TableInfoLoaderTest - 描述列的注释: 主键
logger.info.TableInfoLoaderTest - 该列的默认值: null
logger.info.TableInfoLoaderTest - 列中的最大字节数: null
logger.info.TableInfoLoaderTest - 列的索引: 1
logger.info.TableInfoLoaderTest - 是否允许使用 NULL: NO
logger.info.TableInfoLoaderTest - 指示此列是否自动增加: NO
columnLabel | 返回类型 | 描述 |
---|---|---|
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 — 如果该列不自动增加, 空字符串 — 如果不能确定该列是否是自动增加参数 |
public enum ResultSetColumnKeys {
/**
* 表类别
*/
TABLE_CAT,
/**
* 表模式
*/
TABLE_SCHEM,
/**
* 表名称
*/
TABLE_NAME,
/**
* 列名称
*/
COLUMN_NAME,
/**
* 来自 java.sql.Types 的 SQL 类型
*/
DATA_TYPE,
/**
* 数据源依赖的类型名称,对于 UDT,该类型名称是完全限定的
*/
TYPE_NAME,
/**
* 列的大小
*/
COLUMN_SIZE,
/**
* 小数部分的位数。对于 DECIMAL_DIGITS 不适用的数据类型,则返回 Null。
*/
DECIMAL_DIGITS,
/**
* 基数(通常为 10 或 2)
*/
NUM_PREC_RADIX,
/**
* 是否允许使用 NULL。 columnNoNulls - 可能不允许使用NULL值, columnNullable - 明确允许使用NULL值, columnNullableUnknown - 不知道是否可使用 null
*/
NULLABLE,
/**
* 描述列的注释(可为null)
*/
REMARKS,
/**
* 该列的默认值,当值在单引号内时应被解释为一个字符串(可为null)
*/
COLUMN_DEF,
/**
* 未使用
*/
SQL_DATA_TYPE,
/**
* 未使用
*/
SQL_DATETIME_SUB,
/**
* 对于 char 类型,该长度是列中的最大字节数
*/
CHAR_OCTET_LENGTH,
/**
* 表中的列的索引(从 1 开始)
*/
ORDINAL_POSITION,
/**
* 是否允许使用 NULL, columnNoNulls - 可能不允许使用NULL值, columnNullable - 明确允许使用NULL值, columnNullableUnknown - 不知道是否可使用 null
*/
IS_NULLABLE,
/**
* 表的类别,它是引用属性的作用域(如果 DATA_TYPE 不是 REF,则为null)
*/
SCOPE_CATLOG,
/**
* 表的模式,它是引用属性的作用域(如果 DATA_TYPE 不是 REF,则为null)
*/
SCOPE_SCHEMA,
/**
* 表名称,它是引用属性的作用域(如果 DATA_TYPE 不是 REF,则为null)
*/
SCOPE_TABLE,
/**
* 不同类型或用户生成 Ref 类型、来自 java.sql.Types 的 SQL 类型的源类型(如果 DATA_TYPE 不是 DISTINCT 或用户生成的 REF,则为null)
*/
SOURCE_DATA_TYPE,
/**
* 指示此列是否自动增加,YES --- 如果该列自动增加 , NO --- 如果该列不自动增加, 空字符串 --- 如果不能确定该列是否是自动增加参数
*/
IS_AUTOINCREMENT;
}