最近在编写 KUTILS 的时候,需要通过JDBC
抓取数据库的字段的数据类型、字段名称、字段注释、字段长度、字段精度等信息,这里记录下一些经常会使用到的信息。由于代码长度及表格问题文章横屏更适合阅读。
单元测试代码
1public class TableInfoLoaderTest {
2
3 private Connection connection;
4 private Logger logger = LoggerFactory.getLogger(this.getClass());
5
6 @Before
7 public void before() {
8 DataSourceInfo dataSource = new DataSourceInfo();
9 dataSource.setDriver("com.mysql.jdbc.Driver");
10 dataSource.setUsername("root");
11 dataSource.setPassword("Ab123456");
12 dataSource.setUrl("jdbc:mysql://192.168.120.22:3306/activity?characterEncoding=UTF-8");
13 connection = ConnectionUtil.getConnection(dataSource);
14 }
15
16 @Test
17 public void testQueryDataInfo() {
18 String table = "activity_info";
19 try {
20 DatabaseMetaData metaData = connection.getMetaData();
21 ResultSet rs = metaData.getColumns(connection.getCatalog(), "%", table, "%");
22 while (rs.next()) {
23 System.out.println();
24 logger.info("列名称:\t{}", rs.getString(ResultSetColumnKeys.COLUMN_NAME.name()));
25 logger.info("java.sql.Types:\t{}", rs.getString(ResultSetColumnKeys.DATA_TYPE.name()));
26 logger.info("字段类型:\t{}", rs.getString(ResultSetColumnKeys.TYPE_NAME.name()));
27 logger.info("列的大小:\t{}", rs.getString(ResultSetColumnKeys.COLUMN_SIZE.name()));
28 logger.info("小数部分的位数:\t{}", rs.getString(ResultSetColumnKeys.DECIMAL_DIGITS.name()));
29 logger.info("基数:\t{}", rs.getString(ResultSetColumnKeys.NUM_PREC_RADIX.name()));
30 logger.info("描述列的注释:\t{}", rs.getString(ResultSetColumnKeys.REMARKS.name()));
31 logger.info("该列的默认值:\t{}", rs.getString(ResultSetColumnKeys.COLUMN_DEF.name()));
32 logger.info("列中的最大字节数:\t{}", rs.getString(ResultSetColumnKeys.CHAR_OCTET_LENGTH.name()));
33 logger.info("列的索引:\t{}", rs.getString(ResultSetColumnKeys.ORDINAL_POSITION.name()));
34 logger.info("是否允许使用 NULL:\t{}", rs.getString(ResultSetColumnKeys.IS_NULLABLE.name()));
35 logger.info("指示此列是否自动增加:\t{}", rs.getString(ResultSetColumnKeys.IS_AUTOINCREMENT.name()));
36 }
37 rs.close();
38 } catch (SQLException e) {
39 throw new RuntimeException("表信息抽取异常!", e);
40 }
41
42 }
43}
结果
1logger.info.TableInfoLoaderTest - 列名称: id
2logger.info.TableInfoLoaderTest - java.sql.Types: -5
3logger.info.TableInfoLoaderTest - 字段类型: BIGINT
4logger.info.TableInfoLoaderTest - 列的大小: 19
5logger.info.TableInfoLoaderTest - 小数部分的位数: 0
6logger.info.TableInfoLoaderTest - 基数: 10
7logger.info.TableInfoLoaderTest - 描述列的注释: 主键
8logger.info.TableInfoLoaderTest - 该列的默认值: null
9logger.info.TableInfoLoaderTest - 列中的最大字节数: null
10logger.info.TableInfoLoaderTest - 列的索引: 1
11logger.info.TableInfoLoaderTest - 是否允许使用 NULL: NO
12logger.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 --- 如果该列不自动增加, 空字符串 --- 如果不能确定该列是否是自动增加参数 |
文章转载自Kenny纪实号,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。