ResultSetMetaData DatabaseMetaData中的方法的介绍

 

如何获取数据库信息及表的信息,如:数据库中有多少表,表中的字段的含义等,这里用主要用到相关的两个类ResultSetMetaDataDataBaseMetaData

 

首先是ResultSetMetaData

 

 

 
使用DatabaseMetaData则是用来获得数据库的信息,下面介绍这个类的使用方法。

 

DatabaseMetaData对象提供的是关于数据库的各种信息,这些信息包括:

1    数据库与用户,数据库标识符以及函数与存储过程。

2    数据库限制。

3    数据库支持不支持的功能。

4    架构、编目、表、列和视图等。

 

通过调用DatabaseMetaData的各种方法,程序可以动态的了解一个数据库。由于这个类中的方法非常的多那么就介绍几个常用的方法来给大家参考。

DatabaseMetaData实例的获取方法是,通过连接来获得的

Connection conn = //创建的连接。

DatabaseMetaData dbmd = Conn.getMetaData();

 

创建了这个实例,就可以使用他的方法来获取数据库得信息。首先是数据库中用户标识符的信息的获得,主要使用如下的方法:

getDatabaseProductName()用以获得当前数据库是什么数据库。比如oracleaccess等。返回的是字符串。

getDatabaseProductVersion()获得数据库的版本。返回的字符串。

getDriverVersion()获得驱动程序的版本。返回字符串。

supportsResultSetType(ResultSet.resultype)是判定是否支持这种结果集的类型。比如参数如果是Result.TYPE_FORWARD_ONLY,那就是判定是否支持,只能先前移动结果集的指针。返回值为booleantrue表示支持。

 

上面介绍的只是几个常用的方法,这个类中还有很多方法,可以到jdk的帮助文档中去查看类java.sql.DatabaseMetaData

 

这个类中还有一个比较常用的方法就是获得表的信息。使用的方法是:

getTablesString catalog,String schema,String tableName,String[] types),

这个方法带有四个参数,他们表示的含义如下:

String catalog——要获得表所在的编目。串“”””意味着没有任何编目,Null表示所有编目。

String schema——要获得表所在的模式。串“”””意味着没有任何模式,Null表示所有模式。该参数可以包含单字符的通配符(“_”),也可以包含多字符的通配符(“%”)。

String tableName——指出要返回表名与该参数匹配的那些表,该参数可以包含单字符的通配符(“_”),也可以包含多字符的通配符(“%”)。

String types——一个指出返回何种表的数组。可能的数组项是:”TABLE”,”VIEW”,

SYSTEM TABLE”,”GLOBAL TEMPORARY”,”LOCAL TEMPORARY”,”ALIAS”,

SYSNONYM”。

 

通过getTables()方法返回一个表的信息的结果集。
这个结果集包括字段有:TABLE_CAT表所在的编目。TABLE_SCHEM表所在的模式,TABLE_NAME表的名称。TABLE_TYPE标的类型。REMARKS一段解释性的备注。通过这些字段可以完成表的信息的获取。

 

还有两个方法一个是获得列:
getColumns(String catalog,String schama,String tablename,String columnPattern)一个是获得关键字的方法
getPrimaryKeys(String catalog, String schema, String table)这两个方法中的参数的含义和上面的介绍的是相同的。
凡是pattern的都是可以用通配符匹配的。getColums()返回的是结果集,这个结果集包括了列的所有信息,类型,名称,可否为空等。getPrimaryKey()则是返回了某个表的关键字的结果集。

通过getTables(),getColumns(),getPrimaryKeys()就可以完成表的反向设计了。主要步骤如下:

1 通过getTables()获得数据库中表的信息。

2 对于每个表使用,getColumns(),getPrimaryKeys()获得相应的列名,类型,限制条件,关键字等。

3 通过12获得信息可以生成相应的建表的SQL语句。
public void getResultSetMetaData() {
        String sqlStr = "SELECT * FROM STUDENTINFO";
        ResultSet rs = null;
        Statement smt = null;
        try {
            String[] tp = {"TABLE"};
            smt = conn.createStatement();
            rs = smt.executeQuery(sqlStr);
            ResultSetMetaData rsmd = rs.getMetaData();
            /*
               获得ResultSetMeataData对象。所有方法的参数都是列的索引号,即第几列,从1开始
            */
            System.out.println("下面这些方法是ResultSetMetaData中方法");
            System.out.println("获得1列所在的Catalog名字 : " + rsmd.getCatalogName(1));
            System.out.println("获得1列对应数据类型的类 " + rsmd.getColumnClassName(1));
            System.out.println("获得该ResultSet所有列的数目 " + rsmd.getColumnCount());
            System.out.println("1列在数据库中类型的最大字符个数" + rsmd.getColumnDisplaySize(1));
            System.out.println("1列的默认的列的标题" + rsmd.getColumnLabel(1));
            System.out.println("1列的模式" + rsmd.getSchemaName(1));
            System.out.println("1列的类型,返回SqlType中的编号 " + rsmd.getColumnType(1));
            System.out.println("1列在数据库中的类型,返回类型全名" + rsmd.getColumnTypeName(1));
            System.out.println("1列类型的精确度(类型的长度): " + rsmd.getPrecision(1));
            System.out.println("1列小数点后的位数 " + rsmd.getScale(1));
            System.out.println("1列对应的模式的名称(应该用于Oracle) " + rsmd.getSchemaName(1));
            System.out.println("1列对应的表名 " + rsmd.getTableName(1));
            System.out.println("1列是否自动递增" + rsmd.isAutoIncrement(1));
            System.out.println("1列在数据库中是否为货币型" + rsmd.isCurrency(1));
            System.out.println("1列是否为空" + rsmd.isNullable(1));
            System.out.println("1列是否为只读" + rsmd.isReadOnly(1));
            System.out.println("1列能否出现在where中" + rsmd.isSearchable(1));
        }
        catch (SQLException ex) {
            ex.printStackTrace();
        }
    }