JDBC连接数据库获取表字段的注释信息

最近在编写 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_CATString表类别(可为null)
TABLE_SCHEMString表模式(可为null)
TABLE_NAMEString表名称
COLUMN_NAMEString列名称
DATA_TYPEint来自 java.sql.Types 的 SQL 类型
TYPE_NAMEString数据源依赖的类型名称,对于 UDT,该类型名称是完全限定的
COLUMN_SIZEint列的大小。 BUFFER_LENGTH 未被使用。
DECIMAL_DIGITSint小数部分的位数。对于 DECIMAL_DIGITS 不适用的数据类型,则返回 Null。
NUM_PREC_RADIXint基数(通常为 10 或 2)
NULLABLEint是否允许使用 NULL。 columnNoNulls - 可能不允许使用NULL值, columnNullable - 明确允许使用NULL值, columnNullableUnknown - 不知道是否可使用 null
REMARKSString描述列的注释(可为null)
COLUMN_DEFString该列的默认值,当值在单引号内时应被解释为一个字符串(可为null)
SQL_DATA_TYPEint未使用
SQL_DATETIME_SUBint未使用
CHAR_OCTET_LENGTHint对于 char 类型,该长度是列中的最大字节数
ORDINAL_POSITIONint表中的列的索引(从 1 开始)
IS_NULLABLEStringISO 规则用于确定列是否包括 null, YES — 如果参数可以包括 NULL, NO — 如果参数不可以包括 NULL, 空字符串 — 如果不知道参数是否可以包括 null
SCOPE_CATLOGString表的类别,它是引用属性的作用域(如果 DATA_TYPE 不是 REF,则为null)
SCOPE_SCHEMAString表的模式,它是引用属性的作用域(如果 DATA_TYPE 不是 REF,则为null)
SCOPE_TABLEString表名称,它是引用属性的作用域(如果 DATA_TYPE 不是 REF,则为null)
SOURCE_DATA_TYPEshort不同类型或用户生成 Ref 类型、来自 java.sql.Types 的 SQL 类型的源类型(如果 DATA_TYPE 不是 DISTINCT 或用户生成的 REF,则为null)
IS_AUTOINCREMENTString指示此列是否自动增加,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;
}
  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值