元数据接口使用详解
三个元数据接口DatabaseMetaData、ResultSetMetaData和ParameterMetaData接口是三个常用的元数据接口。DatabaseMetaData提供与数据库或者DBMS相关的信息;ResultSetMetaData对象提供与特定ResultSet实例中与列相关的信息;ParameterMetaData对象提供与PreparedStatement对象的参数有关的信息。本文讨论的内容并不仅限于JDBC的某个版本,而是基于1.0—3.0的规范进行学习。
当在JDBC应用程序中发送select语句时,该操作会返回一个ResultSet对象,这个ResultSet对象包含满足条件的数据。通过创建ResultMetaData对象和调用该对象的方法,可以获取与这个ResultSet对象中的列有关的信息。下面的代码段将创建ResultSet对象rs,然后使用rs来创建ResultSetMetaData对象,所创建的ResultSetMetaData对象包含与rs中的列有关的信息。 Statement stmt= con . createStatement(); ResultSet rs = stmt.executeQuery(“select * from sales”); ResultSetMetaData rsmd = rs.getMetaData(); 现在可以使用rsmd调用ResultSetMetaData的方法来访问与rs中的列有关的信息。除了方法getColumnCount给出结果集中总的列数外,所有的ResultSetMetaData方法都返回与单个列有关的信息,并都接受一个表示对应列号的参数。 getColumnCount方法
这也许是ResultSetMetaData中使用最多的方法,该方法返回结果集中列数目 : ResultSet rs = stmt.executeQuery(“select * from sales”); ResultSetMetaData rsmd = rs.getMetaData(); int numberOfColumns = rsmd.getColumnCount(); while(rs.next()){ for(int i=1;i<=numberOfColumn;i++){ String s = rs.getString(i); System.out.println(“Column ” +i +”: ” +s +” ”); } } 需要注意的是,用于检索所有列值的ResultSet方法是getString。当不知道每一列的类型,这是比较容易的方法;如果希望能检索所有的数据类型(包括SQL 99数据型),则可以使用方法getObject,这是保证能够检索所有列值得唯一方法。 获取列类型信息
有两个ResultSetMetaData方法可以获取与结果集列的类型有关的信息。这 两个方法是getColumnType和getColumnTypeName。getColumnType方法用于确定存储在指定列中的值的JDBC类型。该方法以一个int值来返回JDBC类型。如下面的代码获得rs第二列的JDBC类型: ResultSetMetaData rsmd = rs.getMetaData(); int jdbcType = rsmd.getColumnType(2); 获取其他信息
另外有几个方法用来提供与存储数值类型的列有关的信息。isAutoIncrement isCurrency isSigned getPrecision getScale isNullable getColumnDisplaySize 使用DatabaseMetaData对象
接口DatabaseMetaData提供了大量的方法取得与数据库相关的信息。一旦获得了打开的连接,就可以创建包含与数据库系统有关的信息的DatabaseMetaData对象。 DatabaseMetaData方法的类别
按照返回值的类型对DatabaseMetaData的方法进行分类,可以分为4种。
有三种类型返回单一的值,另外一种返回一个结果集,这个结果集包含1~18列的数据。 ① 返回String的方法
最小的类别是指返回String对象的DatabaseMetaData方法。这些方法中的一些方法可以获取与DBMS有关的总体信息,包括数据库的URL、username、产品名称、驱动程序信息等等。
② 返回int的方法
③ 返回boolean的方法
④返回ResultSet对象的方法
这些方法可以返回ResultSet对象,所返回的ResultSet对象可以包含1到最多18列。 获取与主外键有关的信息
返回与主外键有关信息的方法主要有getPrimaryKeys、getImportedKeys、getExportedKeys以及getCrossReference等。
下面的代码段显示了如果在定义表时指定了主键,则可以调用方法getPrimaryKeys开获取对于表中主键列的描述。 import java.sql.*; public class static PrimaryKeysExample{ public static void main(String args[]){ String url =”jdbc:mySubprotocol:myDataSource”; Connection con; String createString =”create table supplierspk”+ “(sup_id integer not null,”+ “sup_name varchar(40),”+ “street varchar(40),”+ “city varchar(20)”+ “state char(10),”+ “zip char(10),”+ “primary key(sup_id))”; Statement stmt; try{ Class.forName(“myDriver.className”); }catch(java.lang.ClassNotFoundException e){ System.err.println(“ClassNotFoundException: ”); System.err.println(“e.getMessage()”); } try{ con =DriverManager.getConnection(url,”username”,”pwd”); stmt=con.createStatement; stmt.executeUpdate(createString); DatabaseMetaData dbmd=con.getMetaData(); ResultSet rs= dbmd.getPrimaryKey(null,null,”suplierspk”); While(rs.next()){ String name =rs.getString(“table_name”); String columnName=rs.getString(“column_name”); String keySeq=rs.getString(“key_seq”); String pkName=rs.getString(“pk_name”); System.out.println(“table name :”+name); System.out.println(“column name: ”+columnName); System.out.println(“sequence in key:”+keySeq); System.out.println(“primary key name:”+pkName); } rs.close(); stmt.close(); con.close(); }catch(SQLException ex){ System.err.println(“SQLException: ”+ex.getMessage()); } } } 如果主键多余一列的话,那么方法getPrimaryKeys等将详细描述每一列。列key_seq中的值表示描述的是哪一列。 使用ParameterMetaData对象