JDBC中通过MetaData来获取具体的表的相关信息

MetaData

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下的获取表信息的代码了
//1. JDBC连接MYSQL的代码很标准。 
class.forName("com.mysql.jdbc.Driver"); 
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/test?",root","root");

//2. 下面就是获取表的信息。 
dm= conn.getMetaData(); 
ResultSet tableRet = dm.getTables(null, "%",m_TableName,new String[]{"TABLE"}); 
/*其中"%"就是表示*的意思,也就是任意所有的意思。其中m_TableName就是要获取的数据表的名字,如果想获取所有的表的名字,就可以使用"%"来作为参数了。*/

//3. 提取表的名字。 
while(tableRet.next) {
System.out.println(tableRet.getString("TABLE_NAME"));
};
/*通过getString("TABLE_NAME"),就可以获取表的名字了。 
从这里可以看出,前面通过getTables的接口的返回,JDBC是将其所有的结果,保存在一个类似table的内存结构中,而其中TABLE_NAME这个名字的字段就是每个表的名字。*/

//4. 提取表内的字段的名字和类型 
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_CATString表类别(可为 null)
TABLE_SCHEMString表模式(可为 null)
TABLE_NAMEString表名称
COLUMN_NAMEString列名称
DATA_TYPEint来自 java.sql.Types 的 SQL 类型
TYPE_NAMEString数据源依赖的类型名称,对于 UDT,该类型名称是完全限定的
COLUMN_SIZEint列的大小。
BUFFER_LENGTHnull未被使用
DECIMAL_DIGITSint小数部分的位数。对于 DECIMAL_DIGITS 不适用的数据类型,则返回 Null。
NUM_PREC_RADIXint基数(通常为 10 或 2)
NULLABLEint是否允许使用 NULL。
columnNoNullsnull可能不允许使用 NULL 值
columnNullablenull明确允许使用 NULL 值
columnNullableUnknownnull不知道是否可使用 null
REMARKSString描述列的注释(可为 null)
COLUMN_DEFString该列的默认值,当值在单引号内时应被解释为一个字符串(可为 null)
SQL_DATA_TYPEint未使用
SQL_DATETIME_SUBint未使用
CHAR_OCTET_LENGTHint对于 char 类型,该长度是列中的最大字节数
ORDINAL_POSITIONint表中的列的索引(从 1 开始)
IS_NULLABLEStringISO 规则用于确定列是否包括 null。
YESnull如果参数可以包括 NULL
NOnull如果参数不可以包括 NULL
空字符串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指示此列是否自动增加
YESnull如果该列自动增加
NOnull如果该列不自动增加
空字符串null如果不能确定该列是否是自动增加参数
COLUMN_SIZEnull列表示给定列的指定列大小。对于数值数据,这是最大精度。对于字符数据,这是字符长度。对于日期时间数据类型,这是 String 表示形式的字符长度(假定允许的最大小数秒组件的精度)。对于二进制数据,这是字节长度。对于 ROWID 数据类型,这是字节长度。对于列大小不适用的数据类型,则返回 Null。

参数:
catalog - 类别名称;它必须与存储在数据库中的类别名称匹配;该参数为 “” 表示获取没有类别的那些描述;为 null 则表示该类别名称不应该用于缩小搜索范围
schemaPattern - 模式名称的模式;它必须与存储在数据库中的模式名称匹配;该参数为 “” 表示获取没有模式的那些描述;为 null 则表示该模式名称不应该用于缩小搜索范围
tableNamePattern - 表名称模式;它必须与存储在数据库中的表名称匹配
columnNamePattern - 列名称模式;它必须与存储在数据库中的列名称匹配

获取所有表
String catalog = conn.getCatalog(); //catalog 其实也就是数据库名  
ResultSet tablesResultSet = dbMetaData.getTables(catalog,null,null,new String[]{"TABLE"});  
while(tablesResultSet.next()){  
    String tableName = tablesResultSet.getString("TABLE_NAME");  
}  
类型描述
TABLE_CATString表类别(可为 null)
TABLE_SCHEMString表模式(可为 null)
TABLE_NAMEString表名称
TABLE_TYPEString表类型。典型的类型是 TABLE、VIEW、SYSTEM TABLE、GLOBAL TEMPORARY、LOCAL TEMPORARY、ALIAS 和 SYNONYM。
REMARKSString表的解释性注释
TYPE_CATString类型的类别(可为 null)
TYPE_SCHEMString类型模式(可为 null)
TYPE_NAMEString类型名称(可为 null)
SELF_REFERENCING_COL_NAMEString有类型表的指定 identifier列的名称(可为 null)。
REF_GENERATIONString指定在 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_CATString表类别(可为 null)
TABLE_SCHEMString表模式(可为 null)
TABLE_NAMEString表名称
COLUMN_NAMEString列名称
KEY_SEQshort主键中的序列号(值 1 表示主键中的第一列,值 2 表示主键中的第二列)。
PK_NAMEString主键的名称(可为 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_CATString被导入的主键表类别(可为 null)
PKTABLE_SCHEMString被导入的主键表模式(可为 null)
PKTABLE_NAMEString被导入的主键表名称
PKCOLUMN_NAMEString被导入的主键列名称
FKTABLE_CATString外键表类别(可为 null)
FKTABLE_SCHEMString外键表模式(可为 null)
FKTABLE_NAMEString外键表名称
FKCOLUMN_NAMEString外键列名称
KEY_SEQshort外键中的序列号(值 1 表示外键中的第一列,值 2 表示外键中的第二列)
UPDATE_RULE short更新主键时外键发生的变化
DELETE_RULEshort删除主键时外键发生的变化
PK_NAMEString主键的名称(可为 null)
FK_NAMEString外键的名称(可为 null)
DEFERRABILITYshort是否可以将对外键约束的评估延迟到提交时间

参考:http://www.cnblogs.com/lbangel/p/3487796.html

  • 7
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
获取数据库所有信息,可以使用JavaJDBC API的DatabaseMetaData接口。以下是获取所有信息的示例代码: ```java import java.sql.*; public class DatabaseMetaDataExample { public static void main(String[] args) { try { // 连接数据库 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "password"); // 获取数据库元数据 DatabaseMetaData metaData = conn.getMetaData(); // 获取所有信息 String[] types = {"TABLE"}; ResultSet rs = metaData.getTables(null, null, "%", types); // 遍历结果集,输出名 while (rs.next()) { String tableName = rs.getString("TABLE_NAME"); System.out.println(tableName); } // 关闭连接和结果集 rs.close(); conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } ``` 在上面的代码,我们首先使用`DriverManager`获取数据库连接,然后通过连接对象的`getMetaData`方法获取数据库元数据。接着,我们使用`getTables`方法获取所有信息的结果集,并遍历结果集输出名。最后,记得关闭连接和结果集。 需要注意的是,`getTables`方法的参数,第一个参数是数据库名称,第二个参数是模式(即数据库的用户),第三个参数是名的匹配模式,`%`示匹配所有。`getTables`方法返回的结果集包含所有信息,包括名、类型、备注等。如果需要获取更详细的信息,可以使用`getColumns`、`getPrimaryKeys`、`getImportedKeys`等方法。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值