`
x98zero
  • 浏览: 109846 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

ResultSetMetaData和DatabaseMetaData用法介绍

    博客分类:
  • JDBC
阅读更多
内容概要:

1、ResultSetMetaData中的方法的介绍。

2、DatabaseMetaData中主要方法的介绍。

3、如何使用DatabaseMetaData类获得的信息进行反向设计表。


在论坛中看到有好多人问关于,数据库中信息和表的信息的获得的问题,如:数据库中有多少表,表中的字段的含义等,为了解决这个问题我学习了相关的两个类ResultSetMetaData和DataBaseMetaData来解决相关问题。下面是我的一些学习的心得体会,希望能够给朋友们带来一点启示或者帮助。首先是ResultSetMetaData:

这个类完成了查询结果信息和结果中的列的各种信息。它包含的方法以及各个方法的作用,在下面这个演示程序中一一介绍。在这个演示程序中用到数据库是Access的,数据库中的表的名字是STUDENTINFO表,包含字段有

IDNO 文本型 长为8

NAME 文本型 长为8

SEX 文本型 长为6

AGE 数值型 长为8

BIRTHDT 文本型 长为8

程序中主要是操作这个表,选择的驱动是ODBC。程序如下:


import java.sql.*;



public class DBAccess {

 public static java.sql.Connection conn = null;

 private String sqlStr = "";

public DBAccess()

 {

 //new sun.jdbc.odbc.JdbcOdbcDriver();

 try {

 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

 conn = DriverManager.getConnection("jdbc:odbc:TestDB","admin","");

 }

 catch (ClassNotFoundException ex) {

 System.out.println(ex.toString());

 }

 catch(SQLException sqlEx){

 System.out.println(sqlEx.toString());

 }

 }

public ResultSet Search() {

 ResultSet rset = null;

 sqlStr = "SELECT * FROM STUDENTINFO";

 Statement smt = null;

 try {

 smt = conn.createStatement();

 rset = smt.executeQuery(sqlStr);

 }

 catch (SQLException ex) {

 System.out.println("Exception:"+ex.toString());

 }

 return rset;



 }

 public void getResultSetMetaData()

{

 ResultSet rs = null;

 try {

 String[] tp = {"TABLE"};

 rs = this.Search();

 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();

}

}



public static void main(String args[])

 {

 DBAccess dbAccess = new DBAccess();

 dbAccess.getResultSetMetaData();

 }

}


通过上面例子中的方法能够获得,ResultSet中的表的信息。ResultSetMetaData只是获得表的信息,使用DatabaseMetaData则是用来获得数据库的信息,下面介绍这个类的使用方法。


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

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

2、 数据库限制。

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

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

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

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

Connection conn = //创建的连接。

DatabaseMetaData dbmd = Conn.getMetaData();


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

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

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

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

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


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

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

getTables(String 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(Stringcatalog, Stringschema, Stringtable)这两个方法中的参数的含义和上面的介绍的是相同的。凡是pattern的都是可以用通配符匹配的。getColums()返回的是结果集,这个结果集包括了列的所有信息,类型,名称,可否为空等。getPrimaryKey()则是返回了某个表的关键字的结果集。


可以得到该库中"表"的所有情况,这里的表包括表,视图,系统表,临时空间,别名,同义词
对于各参数:
String catalog,表的目录,可能为null,"null"匹配所有
String schemaPattern,表的大纲,同上
String tableNamePattern,表名,同上
String[] types,表的类型,"null"匹配所有,可用的类型为:
TABLE,VIEW,SYSEM TABLE,GLOBAL TEMPORARY,LOCAL TEMPORARY,ALIAS,SYNONYM

例如:

DatabaseMetaData dbmd = conn.getMetaData();
        ResultSet rs = dbmd.getTables(null,null,null,null);
        ResultSetMetaData rsmd = rs.getMetaData();
        int j = rsmd.getColumnCount();
        for(int i=1;i<=j;i++){
            out.print(rsmd.getColumnLabel(i)+"\t");
        }
        out.println();
        while(rs.next()){
            for(int i=1;i<=j;i++){
                out.print(rs.getString(i)+"\t");
            }
            out.println();
        }
    对于更详细的表中的列的信息,可以用dbmd(不是rsmd).getColumns(
            String catalog,
            String schemaPattern,
            String tableNamePattern,
            String columnNamePattern
        )



不仅可以获得rsmd中的信息,还可以获得列的大小,小数位数,精度,缺省值,列在表中
的位置等相关信息.
还有两个方法,调用和获取表信息一样,可以获得存储过程和索引的信息:


     ResultSet getProcedures(  
                String catalog,  
                String schemaPattern,  
                String procedurePattern  
            );  
        ResultSet getIndexINFO(  
                String catalog,  
                String schemaPattern,  
                String table,  
               boolean unique,boolean approximate  
           );    


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

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

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

3、 通过1,2获得信息可以生成相应的建表的SQL语句。

通过上述三步完成反向设计表的过程。

分享到:
评论
3 楼 晨必须的 2013-09-17  
列是求和计算出来的,怎么破?用ResultSetMetaData 可以获得么?
2 楼 jimmy9495 2010-04-15  
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");   
  
 conn = DriverManager.getConnection("jdbc:odbc:TestDB","admin","");  

楼主用的也是odbc

我用odbc桥接oracle9i数据库,
用rsmd.getColumnName(i)和rsmd.getColumnTypeName(i)方法取表中字段名和字段类型时遇到表字段类型是timestamp类型的字段取出来的两个值都是空,而且timestamp类型字段之后的其他字段也取不出值了。。。
感觉是oracle的odbc驱动关系,因为通过odbc桥接的方式用ResultSetMetaData取出的是odbc所定义的数据类型,
比如数据库中是number型的取出的是DOUBLE PRECISION,
number(20)取出的是DECIMAL

哪位大哥帮忙看看有什么办法,把timestamp类型的数据也取出来,不胜感激~!!!
1 楼 sxpyrgz 2008-08-14  
不错的东西,学习了! 

相关推荐

    java对数据库操作常用对象及方法整合[归类].pdf

    Java 语言中经常使用的数据库操作对象和方法整合,主要包括 DatabaseMetaData、ResultSet、ResultSetMetaData 等对象。 DatabaseMetaData 对象 DatabaseMetaData 对象提供了关于整个数据库的信息,包括表名、表的...

    DM8程序员手册.pdf

    - 元数据:提供了ResultSetMetaData、DatabaseMetaData、ParameterMetaData的使用信息。 - RowSet:介绍了CachedRowSet和JdbcRowSet的使用。 - 分布式事务支持:讲述了如何使用XA数据源、XA连接和XAResource来管理...

    JDBC-用元数据将结果集封装为List对象[归类].pdf

    它可能包含了一个或多个方法,利用`DatabaseMetaData`和`ResultSetMetaData`来获取并展示数据库或结果集的元信息。 总结来说,JDBC中的元数据功能对于数据库操作非常重要,它们帮助开发者了解数据库的特性和结果集...

    JDBC入门中文文档

    7. **JDBC API的主要接口和类**:包括Driver、Connection、Statement、PreparedStatement、CallableStatement、ResultSet、ResultSetMetaData、DatabaseMetaData等,每个都有其特定的作用和功能。 8. **异常处理**...

    01_传智播客JDBC_jdbc的理论概述

    7. **JDBC API的主要类和接口**:包括Driver、Connection、Statement、PreparedStatement、CallableStatement、ResultSet、ResultSetMetaData、DatabaseMetaData等,它们构成了JDBC的核心。 在"01_传智播客JDBC_...

    ORACLE-JDBC

    11. **元数据(MetaData)**:通过ResultSetMetaData或DatabaseMetaData对象,可以获取关于表结构、列信息、索引等数据库元数据。 12. **游标(Cursor)**:在Oracle JDBC中,游标允许用户从结果集中按行进行导航,...

    关于JDBC方面的学习资料

    ### 关于JDBC的学习资料深度解析 #### 一、JDBC概述 JDBC,全称为Java Database Connectivity,是Java语言中一套标准化的数据库...理解并熟练掌握JDBC的基本概念和使用方法,对于任何Java开发者来说都是至关重要的。

    Java Web程序设计-1期 项目库_单元案例_数据库元数据操作和分页教学案例.doc

    本案例主要讲解如何使用Java的`DatabaseMetaData`类来获取数据库的元数据,并展示了一个简单的分页实现。 首先,`DatabaseMetaData`是Java SQL API的一部分,它是通过数据库连接对象`Connection`获取的。在案例中,...

    Java数据库编程宝典2

    10.2 使用DatabaseMetaData 10.3 检索与数据库相关的信息 10.3.1 在JTree中显示DatabaseMetaData 10.4 检索有关RDBMS功能性的信息 10.5 使用ResultSetMetaData 10.6 小结 第3部分 三层Web站点与JDBC 第11...

    Java数据库编程宝典4

    10.2 使用DatabaseMetaData 10.3 检索与数据库相关的信息 10.3.1 在JTree中显示DatabaseMetaData 10.4 检索有关RDBMS功能性的信息 10.5 使用ResultSetMetaData 10.6 小结 第3部分 三层Web站点与JDBC 第11...

    Java数据库编程宝典1

    10.2 使用DatabaseMetaData 10.3 检索与数据库相关的信息 10.3.1 在JTree中显示DatabaseMetaData 10.4 检索有关RDBMS功能性的信息 10.5 使用ResultSetMetaData 10.6 小结 第3部分 三层Web站点与JDBC 第11...

    Java数据库编程宝典3

    10.2 使用DatabaseMetaData 10.3 检索与数据库相关的信息 10.3.1 在JTree中显示DatabaseMetaData 10.4 检索有关RDBMS功能性的信息 10.5 使用ResultSetMetaData 10.6 小结 第3部分 三层Web站点与JDBC 第11...

    JDBC4.0 PDF教程

    元数据接口(如 ResultSetMetaData 和 DatabaseMetaData)得到了增强,以支持更多类型的信息查询,比如数据库列的默认值等。 ##### 2.3 支持批量更新 JDBC 4.0 提供了对批量更新的支持,可以通过 PreparedStatement...

    jdbc学习和帮助文档...

    - **`DatabaseMetaData`**:提供有关数据库的元数据信息,如支持的SQL语法、存储过程等。 #### 四、JDBC驱动类型 根据驱动程序的工作方式,JDBC驱动程序可以分为以下几类: 1. **JDBC-ODBC Bridge**:通过ODBC桥接...

    传智播客JDBC_所有源码与ppt

    7. **数据库元数据**:如何使用DatabaseMetaData获取数据库的相关信息,如表结构、列信息等。 8. **JDBC连接池**:介绍C3P0、DBCP、Druid等连接池的使用,优化数据库连接的创建和释放。 9. **JDBC高级特性**:包括...

    jdbc基础的详解与总结

    ResultSet 接口是用来接收 select 语句返回的查寻结果的,DatabaseMetaData 是数据库元数据,ResultSetMetaData 是结果集元数据,Types 是特殊的类,只包含静态的常量,代表 jdbc 类型。 jdbc 的应用步骤包括注册...

    DM7程序员手册

    - **DatabaseMetaData**:介绍了如何获取数据库的元数据信息。 - **ParameterMetaData**:解释了如何获取参数的元数据信息。 - **RowSet**: - **CachedRowSet**:介绍了缓存行集的概念及其使用方法。 - **...

    chapter05 实践习题1

    函数通过`DatabaseMetaData`接口的`getTables()`方法获取所有表的信息,再用`getColumns()`方法来获取每个表的列信息。循环遍历结果集,打印出表名和列的相关信息。这里涉及到的`schema-name`参数可以指定为特定的...

Global site tag (gtag.js) - Google Analytics