JDBC中通过MetaData来获取具体的表的相关信息。可以查询数据库中的有哪些表,表有哪些字段,字段的属性等等。MetaData中通过一系列getXXX函数,将这些信息存放到ResultSet里面,然后返回给用户。
DatabaseMetaData dm= con.getMetaData()
rs = dm.getColumns(con.getCatalog(), schema, tableName, null)
rs.getString("DATA_TYPE") // java.sql.Types 的 SQL 类型
rs.getString("COLUMN_SIZE") //列的大小。对于 char 或 date 类型,列的大小是最大字符数,对于 numeric 和 decimal 类型,列的大小就是精度。
rs.getString("DECIMAL_DIGITS") //小数部分的位数
JDBC下的获取表信息的代码了
class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/test?",root","root");
dm= conn.getMetaData();
ResultSet tableRet = dm.getTables(null, "%",m_TableName,new String[]{"TABLE"});
/*其中"%"就是表示*的意思,也就是任意所有的意思。其中m_TableName就是要获取的数据表的名字,如果想获取所有的表的名字,就可以使用"%"来作为参数了。*/
while(tableRet.next) {
System.out.println(tableRet.getString("TABLE_NAME"));
};
/*通过getString("TABLE_NAME"),就可以获取表的名字了。
从这里可以看出,前面通过getTables的接口的返回,JDBC是将其所有的结果,保存在一个类似table的内存结构中,而其中TABLE_NAME这个名字的字段就是每个表的名字。*/
String columnName;
String columnType;
ResultSet rs = dm.getColumns(null,"%", m_TableName,"%");
while(rs.next()) {
columnName = rs.getString("COLUMN_NAME");
columnType = rs.getString("TYPE_NAME");
int datasize = rs.getInt("COLUMN_SIZE");
int digits = rs.getInt("DECIMAL_DIGITS");
int nullable = rs.getInt("NULLABLE");
System.out.println(columnName+" "+columnType+" "+datasize+" "+digits+" "+ nullable);
}
/*JDBC里面通过getColumns的接口,实现对字段的查询。跟getTables一样,"%"表示所有任意的(字段),而m_TableName就是数据表的名字。
getColumns的返回也是将所有的字段放到一个类似的内存中的表,而COLUMN_NAME就是字段的名字,TYPE_NAME就是数据类型,比如"int","int unsigned"等等,COLUMN_SIZE返回整数,就是字段的长度,比如定义的int(8)的字段,返回就是8,最后NULLABLE,返回1就表示可以是Null,而0就表示Not Null。*/
列 | 类型 | 描述 |
---|
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 | null | 未被使用 |
DECIMAL_DIGITS | int | 小数部分的位数。对于 DECIMAL_DIGITS 不适用的数据类型,则返回 Null。 |
NUM_PREC_RADIX | int | 基数(通常为 10 或 2) |
NULLABLE | int | 是否允许使用 NULL。 |
columnNoNulls | null | 可能不允许使用 NULL 值 |
columnNullable | null | 明确允许使用 NULL 值 |
columnNullableUnknown | null | 不知道是否可使用 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 | 如果参数可以包括 NULL |
NO | null | 如果参数不可以包括 NULL |
空字符串 | 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 | null | 如果该列自动增加 |
NO | null | 如果该列不自动增加 |
空字符串 | null | 如果不能确定该列是否是自动增加参数 |
COLUMN_SIZE | null | 列表示给定列的指定列大小。对于数值数据,这是最大精度。对于字符数据,这是字符长度。对于日期时间数据类型,这是 String 表示形式的字符长度(假定允许的最大小数秒组件的精度)。对于二进制数据,这是字节长度。对于 ROWID 数据类型,这是字节长度。对于列大小不适用的数据类型,则返回 Null。 |
参数:
catalog - 类别名称;它必须与存储在数据库中的类别名称匹配;该参数为 “” 表示获取没有类别的那些描述;为 null 则表示该类别名称不应该用于缩小搜索范围
schemaPattern - 模式名称的模式;它必须与存储在数据库中的模式名称匹配;该参数为 “” 表示获取没有模式的那些描述;为 null 则表示该模式名称不应该用于缩小搜索范围
tableNamePattern - 表名称模式;它必须与存储在数据库中的表名称匹配
columnNamePattern - 列名称模式;它必须与存储在数据库中的列名称匹配
获取所有表
String catalog = conn.getCatalog();
ResultSet tablesResultSet = dbMetaData.getTables(catalog,null,null,new String[]{"TABLE"});
while(tablesResultSet.next()){
String tableName = tablesResultSet.getString("TABLE_NAME");
}
列 | 类型 | 描述 |
---|
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) |
某个表的主键
String tableName = ...;
ResultSet primaryKeyResultSet = dbMetaData.getPrimaryKeys(catalog,null,tableName);
while(primaryKeyResultSet.next()){
String primaryKeyColumnName = primaryKeyResultSet.getString("COLUMN_NAME");
}
某个表的外键
ResultSet foreignKeyResultSet = dbMetaData.getImportedKeys(catalog,null,tableName);
while(foreignKeyResultSet.next()){
String fkColumnName = foreignKeyResultSet.getString("FKCOLUMN_NAM");
String pkTablenName = foreignKeyResultSet.getString("PKTABLE_NAME");
String pkColumnName = foreignKeyResultSet.getString("PKCOLUMN_NAME");
}
primayKeyResultSet 有以下几列:
列 | 类型 | 描述 |
---|
TABLE_CAT | String | 表类别(可为 null) |
TABLE_SCHEM | String | 表模式(可为 null) |
TABLE_NAME | String | 表名称 |
COLUMN_NAME | String | 列名称 |
KEY_SEQ | short | 主键中的序列号(值 1 表示主键中的第一列,值 2 表示主键中的第二列)。 |
PK_NAME | String | 主键的名称(可为 null) |
某个表的外键
ResultSet foreignKeyResultSet = dbMetaData.getImportedKeys(catalog,null,tableName);
while(foreignKeyResultSet.next()){
String fkColumnName = foreignKeyResultSet.getString("FKCOLUMN_NAM");
String pkTablenName = foreignKeyResultSet.getString("PKTABLE_NAME");
String pkColumnName = foreignKeyResultSet.getString("PKCOLUMN_NAME");
}
foreignKeyResultSet 有以下几列:
列 | 类型 | 描述 |
---|
PKTABLE_CAT | String | 被导入的主键表类别(可为 null) |
PKTABLE_SCHEM | String | 被导入的主键表模式(可为 null) |
PKTABLE_NAME | String | 被导入的主键表名称 |
PKCOLUMN_NAME | String | 被导入的主键列名称 |
FKTABLE_CAT | String | 外键表类别(可为 null) |
FKTABLE_SCHEM | String | 外键表模式(可为 null) |
FKTABLE_NAME | String | 外键表名称 |
FKCOLUMN_NAME | String | 外键列名称 |
KEY_SEQ | short | 外键中的序列号(值 1 表示外键中的第一列,值 2 表示外键中的第二列) |
UPDATE_RULE short | 更新主键时外键发生的变化 | |
DELETE_RULE | short | 删除主键时外键发生的变化 |
PK_NAME | String | 主键的名称(可为 null) |
FK_NAME | String | 外键的名称(可为 null) |
DEFERRABILITY | short | 是否可以将对外键约束的评估延迟到提交时间 |
参考:http://www.cnblogs.com/lbangel/p/3487796.html