JDBC: ResultSetMetaData和DatabaseMetaData

1、ResultSetMetaData中的方法的介绍:

ResultSetMetaData是关于结果集的元数据。它可以通过getMetaData()方法从ResultSet获得元数据。方法如下:

ResultSetMetaData rsmd=rs.getMetaData( );

ResultSetMetaData的方法也很多,通过getColumnCount()方法来举例说明,它被用于返回此 ResultSet 对象中的列数。看下面的程序:

//引入SQL包
import java.sql.*;
public class DatabaseMetaDataEx

{
public static void main(String args[])
{
try{
//加载驱动程序
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
//打开数据库连接,aaa为数据源名称
Connection con=DriverManager.getConnection("jdbc:odbc:aaa","","");
//定义DatabaseMetaData对象   
DatabaseMetaData dmd=con.getMetaData();
//检索可在给定类别中使用的表的描述
ResultSet rs=dmd.getTables(null,null,null,new String[]{"table"});
//定义ResultSetMetaData对象   
ResultSetMetaData rsmd=rs.getMetaData();
//返回此 ResultSet 对象中的列数   
int cols=rsmd.getColumnCount();
for(int i=1;i<=cols;i++)
{
//获取指定列的名称。
System.out.print(rsmd.getColumnName(i)+"/t");
}
System.out.println(""); 
while(rs.next())
{
for(int i=1;i<=cols;i++)
{
System.out.print(rs.getString(i)+"/t");
}
System.out.println("");

}
catch(Exception e )
{
e.printStackTrace();
}
}
}

1、DatabaseMetaData中的方法的介绍:

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

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

2、 数据库限制。

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

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

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

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

Java代码
  1. Connection conn =  //创建的连接。   
  2.   
  3. DatabaseMetaData dbmd = Conn.getMetaData();  
Connection conn = //创建的连接。

DatabaseMetaData dbmd = Conn.getMetaData();



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

Java代码
  1. getDatabaseProductName()用以获得当前数据库是什么数据库。比如oracle,access等。返回的是字符串。  
  2.   
  3. getDatabaseProductVersion()获得数据库的版本。返回的字符串。  
  4.   
  5. getDriverVersion()获得驱动程序的版本。返回字符串。  
  6.   
  7. supportsResultSetType(ResultSet.resultype)是判定是否支持这种结果集的类型。比如参数如果是Result.TYPE_FORWARD_ONLY,那就是判定是否支持,只能先前移动结果集的指针。返回值为booleantrue 表示支持。  
getDatabaseProductName()用以获得当前数据库是什么数据库。比如oracle,access等。返回的是字符串。

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

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

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



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

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

Java代码
  1. getTables(String catalog,String schema,String tableName,String[] types),  
  2.   
  3. 这个方法带有四个参数,他们表示的含义如下:  
  4.   
  5. String catalog——要获得表所在的编目。串“”””意味着没有任何编目,Null表示所有编目。  
  6.   
  7. String schema——要获得表所在的模式。串“”””意味着没有任何模式,Null表示所有模式。该参数可以包含单字符的通配符(“_”),也可以包含多字符的通配符(“%”)。  
  8.   
  9. String tableName——指出要返回表名与该参数匹配的那些表,该参数可以包含单字符的通配符(“_”),也可以包含多字符的通配符(“%”)。  
  10.   
  11.   
  12. String types——一个指出返回何种表的数组。可能的数组项是:”TABLE”,”VIEW”,  
  13.   
  14. ”SYSTEM TABLE”,”GLOBAL TEMPORARY”,”LOCAL TEMPORARY”,”ALIAS”,  
  15.   
  16. “SYSNONYM”。  
  17.   
  18. 通 过getTables()方法返回一个表的信息的结果集。这个结果集包括字段有:TABLE_CAT表所在的编目。TABLE_SCHEM表所在的模 式,TABLE_NAME表的名称。TABLE_TYPE标的类型。REMARKS一段解释性的备注。通过这些字段可以完成表的信息的获取。  
  19.   
  20. 还 有两个方法一个是获得列 getColumns(String catalog,String schama,String tablename,String columnPattern) 一个是获得关键字的方法getPrimaryKeys(Stringcatalog, Stringschema, Stringtable)这两个方法 中的参数的含义和上面的介绍的是相同的。凡是pattern的都是可以用通配符匹配的。getColums()返回的是结果集,这个结果集包括了列的所有 信息,类型,名称,可否为空等。getPrimaryKey()则是返回了某个表的关键字的结果集。  
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

例如:

Java代码
  1. DatabaseMetaData dbmd = conn.getMetaData();  
  2.         ResultSet rs = dbmd.getTables(null , null , null , null );  
  3.         ResultSetMetaData rsmd = rs.getMetaData();  
  4.         int  j = rsmd.getColumnCount();  
  5.         for ( int  i= 1 ;i<=j;i++){  
  6.             out.print(rsmd.getColumnLabel(i)+"/t" );  
  7.         }  
  8.         out.println();  
  9.         while (rs.next()){  
  10.             for ( int  i= 1 ;i<=j;i++){  
  11.                 out.print(rs.getString(i)+"/t" );  
  12.             }  
  13.             out.println();  
  14.         }  
  15.     对于更详细的表中的列的信息,可以用dbmd(不是rsmd).getColumns(  
  16.             String catalog,  
  17.             String schemaPattern,  
  18.             String tableNamePattern,  
  19.             String columnNamePattern  
  20.         )  
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中的信息,还可以获得列的大小,小数位数,精度,缺省值,列在表中
的位置等相关信息.
还有两个方法,调用和获取表信息一样,可以获得存储过程和索引的信息:

Java代码
  1. ResultSet getProcedures(    
  2.            String catalog,    
  3.            String schemaPattern,    
  4.            String procedurePattern    
  5.        );    
  6.    ResultSet getIndexINFO(    
  7.            String catalog,    
  8.            String schemaPattern,    
  9.            String table,    
  10.           boolean  unique, boolean  approximate    
  11.       );      
     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语句。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值