ResultSetMetaData 和DatabaseMetaData的用法

ResultSetMetaData 和DatabaseMetaData的用法

 

1、ResultSetMetaData中的方法的介绍。
2、DatabaseMetaData中主要方法的介绍。
3、如何使用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();   
    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( String catalog, String schema, String table)这两个方法中的参数的含义和上面的介绍的是相同的。凡是pattern的都是可以用通配符匹配的。getColums()返回的是结果集,这个结果集包括了列的所有信息,类型,名称,可否为空等。getPrimaryKey()则是返回了某个表的关键字的结果集。
通过getTables(),getColumns(),getPrimaryKeys()就可以完成表的反向设计了。主要步骤如下:
1、 通过getTables()获得数据库中表的信息。
2、 对于每个表使用,getColumns(),getPrimaryKeys()获得相应的列名,类型,限制条件,关键字等。
3、 通过1,2获得信息可以生成相应的建表的SQL语句。
    通过上述三步完成反向设计表的过程。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用ResultSetMetaData中的getColumnName()、getColumnCount()和getColumnDisplaySize()方法获取列的名称、数量和显示大小。 然而,ResultSetMetaData并没有提供直接获取列的主键或唯一性的方法。要获取这些信息,你需要查询数据库的元数据。可以使用DatabaseMetaData接口中的getPrimaryKeys()和getIndexInfo()方法来获取主键和索引信息。 以下是一个使用ResultSetMetaDataDatabaseMetaData来获取列主键和唯一性信息的示例代码: ```java try { DatabaseMetaData dbmd = conn.getMetaData(); ResultSet rs = stmt.executeQuery("SELECT * FROM my_table"); ResultSetMetaData rsmd = rs.getMetaData(); int numColumns = rsmd.getColumnCount(); for (int i = 1; i <= numColumns; i++) { String columnName = rsmd.getColumnName(i); String columnType = rsmd.getColumnTypeName(i); int columnSize = rsmd.getColumnDisplaySize(i); boolean isPrimaryKey = false; boolean isUnique = false; ResultSet pk = dbmd.getPrimaryKeys(null, null, columnName); if (pk.next()) { isPrimaryKey = true; } ResultSet idx = dbmd.getIndexInfo(null, null, columnName, false, false); if (idx.next()) { isUnique = !idx.getBoolean("NON_UNIQUE"); } System.out.println(columnName + " (" + columnType + "(" + columnSize + "))" + " isPrimaryKey=" + isPrimaryKey + ", isUnique=" + isUnique); } } catch (SQLException e) { e.printStackTrace(); } ``` 这个代码段会遍历查询结果集中的每一列,并使用ResultSetMetaData获取列名、类型和显示大小,并使用DatabaseMetaData获取列的主键和唯一性信息。如果列是主键或唯一的,则将相应的布尔值设置为true,并在控制台上输出列的信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值