JAVA探索数据库结构信息
这个题目写得有点大,因为数据库结构信息包括很多东西,不同的数据库有不同的概念。在这里只是举例说明如何探索
数据库表和表结构的信息。其他信息类似。
其实有些数据库有相应的方法去查询到个数据库表的对应结构信息。如Mysql和Oracle可以使用describe 表名 来得到对应表的结构信息,但是目前我没找到DB2对应的方法。
现在我们要实现的是一个通用的方法,对各种数据库均适合。在java.sql.Connection接口里,SUN定义了几个有用的接口让各个数据库厂商来实现,正是这些方法让我们方便了探索数据库结构,今天我们主要使用getMetaData() 方法来实现我们的目的。 JDK上给出的注释是这样的:
DatabaseMetaData getMetaData()throws SQLException
获取 DatabaseMetaData 对象,该对象包含关于Connection 对象连接到的数据库的元数据。元数据包括关于数据库的表、受支持的 SQL 语法、存储过程、此连接的功能等信息。
返回:此 Connection 对象的一个 DatabaseMetaData 对象
抛出: SQLException - 如果发生数据库访问错误
通过DatabaseMetaData我们可以得到很多关于数据库的信息。通过查看JDK就能清楚的了解到。我先把方法贴一下:
public void testDb2DataStruct() {
Connection conn = this.getDB2Conn();
if (null != conn) {
try {
DatabaseMetaData meta = conn.getMetaData();
ResultSet rs = meta.getColumns(null, null, "T_USER", null);
while (rs.next()) {
System.out.println(rs.getString(1));
System.out.println(rs.getString(2));
System.out.println(rs.getString(3));
System.out.println(rs.getString(4));
System.out.println(rs.getString(5));
System.out.println(rs.getString(6));
System.out.println(rs.getString(7));
System.out.println(rs.getString(8));
System.out.println(rs.getString(9));
System.out.println(rs.getString(10));
System.out.println("-----db2--------");
}
} catch (Exception ex) {
System.out.println(ex);
} finally {
try {
conn.close();
} catch (Exception ex) {
}
}
}
}
说明: 在这个例子中,我首先获得了一个关于DB2的链接,然后获得DatabaseMetaData 实例 meta,通过
getColumns方法获得所有列信息(查看jdk你会发现,里面有很多查看数据库信息的方法)。JDK里给出的getColumns详细说明如下:
ResultSet getColumns(String catalog,
String schemaPattern,
String tableNamePattern,
String columnNamePattern)
throws SQLException检索可在指定类别中使用的表列的描述。
仅返回与类别、模式、表和列名称标准匹配的列描述。它们根据 TABLE_SCHEM、TABLE_NAME 和 ORDINAL_POSITION 进行排序。
每个列描述都有以下列:
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 => 列的大小。对于 char 或 date 类型,列的大小是最大字符数,对于 numeric 和 decimal 类 型,列的大小就是精度。
BUFFER_LENGTH 未被使用。
DECIMAL_DIGITS int => 小数部分的位数
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 => "NO" 表示明确不允许列使用 NULL 值,"YES" 表示可能允许列使用 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)
参数:
catalog - 类别名称,因为存储在数据库中,所以它必须匹配类别名称。该参数为 "" 则检索没有类别的描述,为 null 则 表示该类别名称不应用于缩小搜索范围
schemaPattern - 模式名称的模式,因为存储在数据库中,所以它必须匹配模式名称。该参数为 "" 则检索那些没有模式 的描述,为 null 则表示该模式名称不应用于缩小搜索范围
tableNamePattern - 表名称模式,因为存储在数据库中,所以它必须匹配表名称
columnNamePattern - 列名称模式,因为存储在数据库中,所以它必须匹配列名称
返回:
ResultSet - 每一行都是一个列描述
抛出:
SQLException - 如果发生数据库访问错误
在上面的例子中我查找得到T_USER表的结构信息,你可以将上面的所有信息输出来看看即可知道具体含义。
我已经在MySql、Oracle、DB2、SQL Server上测试过此方法
在DatabaseMetaData中还有一个ResultSet getTables(String catalog, String schemaPattern,String tableNamePattern,String[] types) throws SQLException
该方法会返回对应的数据库表,查询得到所有符合要求的数据库表。这样就可以方便的探测到数据库的详细信息了。
















