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
该方法会返回对应的数据库表,查询得到所有符合要求的数据库表。这样就可以方便的探测到数据库的详细信息了。