如何查询Derby中的元数据内容
在数据库开发过程中,我们经常会遇到需要查询元数据类型的情况。在SQL server中,我们可以利用数据库提供的架构视图来获取我们想要的信息。以下是常用的架构视图,
INFORMATION_SCHEMA.CHECK_CONSTRAINTS:返回有关列或过程参数的信息,如是否允许空值,是否为计算列等。
INFORMATION_SCHEMA.COLUMNS:返回当前数据库中当前用户可以访问的所有列及其基本信息。
INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE:返回当前数据库中定义了约束的所有列及其约束名。
INFORMATION_SCHEMA.CONSTRAINT_TABLE_USAGE:返回当前数据库中定义了约束的所有表及其约束名。
INFORMATION_SCHEMA.KEY_COLUMN_USAGE:返回当前数据库中作为主键/外键约束的所有列。
INFORMATION_SCHEMA.SCHEMATA:返回当前用户具有权限的所有数据库及其基本信息。
INFORMATION_SCHEMA.TABLES:返回当前用户具有权限的当前数据库中的所有表或者视图及其基本信息。
INFORMATION_SCHEMA.VIEWS:返回当前数据库中的当前用户可以访问的视图及其所有者、定义等信息。
由于这些信息架构都是以视图的方式存在的,因此我们可以很方便地获得并利用需要的信息。
查询所有表的例子
select * from INFORMATION_SCHEMA.TABLES where TABLE_TYPE = 'BASE TABLE'
查询指定表中列的例子
SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME=表名
那么在Derby中,我们要怎么做呢? Java为我们提供了一系列标准的操作方式,以下是获取表和列的信息
.getTables(null, null, null, 类型集);
.getColumns(null, null, 表名, null);
getTables(String catalog,string schemapattern,String tablenamepattern,Strin[] type)
返回一个ResultSet对象,每行为一个表的描述,每行的类型和意义如下:
TABLE_CAT:String 类型,表的目录,可能为null;
catalog 字符串,目录名,""(空串)可以检索没有目录的表,null表示忽略目录;
schemapattern字符串,为大纲名称的匹配模式,""可以检索没有大纲的表
tablenamepattern字符串,为表名匹配模式;
type字符串,为需要检索的表类型列表,null 表示返回所有类型;
/**
* @param args
*/
public static void main(String[] args) {
Connection conn = creatJDBCConnection();
ResultSet oResults = null;
String[] types = { "TABLE" };
try {
oResults = conn.getMetaData().getTables(null, null, null, types);
while (oResults.next()) {
String tt = oResults.getString("TABLE_NAME");
String tp = oResults.getString("TABLE_TYPE");
System.out.println(" 表的名称 " + tt + " 表的类型 " + tp);
ResultSet rResults = null;
rResults = conn.getMetaData().getColumns(null, null, tt, null);
while (rResults.next()) {
String ct = rResults.getString("COLUMN_NAME");
String cp = rResults.getString("TYPE_NAME");
String cd = rResults.getString("COLUMN_SIZE");
System.out.println(" -- " + ct + " " + cp + " " + cd);
}
}
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}