当前位置: 首页 > 科技观察

借助JDBCMetadataAPI,发现数据库元数据_0

时间:2023-03-21 17:24:00 科技观察

【.com快者】Metadata基本上就是指这种数据,提供了对其他一些数据的结构化描述。从程序员的角度来看,数据库元数据是指关于数据库数据的数据,或者更准确地说,是关于表、视图、列类型、列名、结果集、存储过程和数据库的信息。Java的JDBC元数据API提供了通过Java代码检索此信息的方法。Java元数据信息对于编写可以适应多个数据库系统或适应任何数据库内容的代码特别有用。这意味着创建一类通用接口以使用高级数据库功能在运行时发现数据库元数据。本文试图探索JDBC元数据API的一些关键特性,以促进数据库元数据的发现。元数据的使用JDBC元数据API可用于检索有关数据库的以下信息:数据库用户、表、视图和存储过程数据库架构和目录信息表、视图和列权限有关表的主键或外键的信息JDBC概述JDBC为客户端应用程序提供了必要的API,以便在元数据类的帮助下发现有关数据库和任何特定结果集(ResultSet)的信息。图1:JDBC配置文件API涉及多个为客户端提供元数据信息的接口。客户端通过JDBC驱动程序管理器检索此信息。驱动程序管理器充当实际数据库和API之间的接口。特定于供应商的数据库提供它们自己的Java驱动程序(类型4驱动程序)。比如MySQL提供了Connector/J;其他数据库(如Oracle或PostgreSQL)有自己的JDBC驱动程序。在数据库供应商不提供任何驱动程序(类型4)的情况下,JavaIDBC/ODBCBridge充当底层ODBC驱动程序和驱动程序管理器之间的中介。无论在何种情况下,检索数据库元数据信息的方法都是相同的。JDBCmetadataAPIJDBCAPI提供了两个用于检索元数据信息的关键接口:DatabaseMetaData和ResultSetMetaData。这两个接口是java.sql包的一部分。DatabaseMetaData主要用于检索有关数据库的信息,例如其功能和结构。另一方面,ResultSetMetaData用于获取有关SQL查询的信息,例如有关其大小和列类型的信息。因此,JDBC元数据API的关键元素如下:DatabaseMetaData该接口通常由数据库供应商实现,并与本机JDBC驱动程序一起提供。本机JDBC驱动程序构建在数据库之上。通过实现这个接口,数据库供应商提供了关于整个数据库的全面信息,例如表名、索引、产品名和版本。该接口中声明了许多方法来检索有关数据库的各种元数据信息。简单示例packageorg.mano.example;importjava.sql.Connection;importjava.sql.DatabaseMetaData;importjava.sql.DriverManager;importjava.sql.SQLException;publicclassDatabaseMetaDataDemo{privatestaticfinalStringURL="jdbc:mysql://localhost:3306/addressbook?zeroDateTimeBehavior=convertToNull";privatestaticfinalStringUSERNAME="testuser";privatestaticfinalStringPASSWORD="secret";publicstaticvoidmain(String[]args){Connectionconn=null;DatabaseMetaDatadbmd=null;try{conn=DriverManager.getConnection(URL,USERNAME,PASSWORD);dbmd=conn.getMetaData();if(dbmd!=null){System.out.println("DatabaseVersion:"+dbmd.getDatabaseProductVersion());System.out.println("DriverName:"+dbmd.getDriverName());System.out.println("DriverVersion:"+dbmd.getDriverVersion());System.out.println("URL:"+dbmd.getURL());System.out.println("UserName:"+dbmd.getUserName());System.out.println((dbmd.supportsANSI92FullSQL()?"ANSI92FullSQLsupported.":"ANSI92FullSQLnotsupported."));System.out.println((dbmd.supportsTransactions()?"Transactionssupported.":"Transactionnotsupported."));}else{System.out.println("Metadatanotsupported");}}catch(SQLExceptionex1){System.err.println(ex1);}finally{try{conn.close();}catch(SQLExceptionex2){}}}}ResultSetMetaData该接口提供了关于ResultSet对象结构的元数据信息,例如比如确定列数、名称、类型和长度、表名、列是可读/可写还是可搜索等。简单示例packageorg.mano.example;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.ResultSet;importjava.sql.ResultSetMetaData;importjava.sql.SQLException;importjava.sql.Statement;publicclassResultSetMetaDataDemo{privatestaticfinalStringURL="jdbc:mysql://localhost:3306/addressbook?zeroDateTimeBehavior=convertToNull";privatestaticfinalStringUSERNAME="testuser";privatestaticfinalStringPASSWORD="secret";privatestaticfinalStringSQL="SELECT*FROMAddresses";publicstaticvoidmain(String[]args){Connectionconn=null;Statementstmt=null;ResultSetrs=null;ResultSetMetaDatarsmd=null;try{conn=DriverManager.getConnection(URL,USERNAME,PASSWORD);stmt=conn.createStatement();rs=stmt.executeQuery(SQL);rsrsmd=rs.getMetaData();if(rsmd!=null){intcols=rsmd.getColumnCount();System.out.println("NumberofColumns:"+cols);System.out.println("TableName:"+rsmd.getTableName(1));系统.out.println("目录名称:"+rsmd.getCatalogName(1));System.out.println("---------------------------------------");for(inti=1;i<=cols;i++){System.out.println("ClassName:"+rsmd.getColumnClassName(i));System.out.println("ColumnName:"+rsmd.getColumnName(i));System.out.println("ColumnTypeName:"+rsmd.getColumnTypeName(i));System.out.println("---------------------------------");}}else{System.out.println("ResultSetMetadatanotsupported");}}(SQLExceptionex1){System.err.println(ex1);}finally{try{stmt.close();rs.close();conn.close();}catch(SQLExceptionex2){}}}}ParameterMetaData参数元数据对象来检索关于PreparedStatement对象中参数标记的信息元数据信息是指使用的参数的类型和属性,例如获取完全限定的Java类名、参数数量、类型、确定列大小的指定精度等。简单示例packageorg.mano.example;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.ParameterMetaData;importjava.sql.PreparedStatement;importjava.sql.SQLException;publicclassParameterMetaDataDemo{privatestaticfinalStringURL="jdbc:mysql://localhost:3306/addressbook?zeroDateTimeBehavior=convertToNull";privatestaticfinalStringUSERNAME="testuser";privatetaticfinalStringPASSWORD="secret";privatestaticfinalStringSQL="SELECTid,firstName,lastNameFROMAddressesWHEREid=?ANDfirstNameLIKE?";publicstaticvoidmain(String[]args){Connectionconn=null;Prepared=Statementpstnull;ParameterMetaDatapmd=null;try{conn=DriverManager.getConnection(URL,USERNAME,PASSWORD);pstmt=conn.prepareStatement(SQL);pmd=pstmt.getParameterMetaData();if(pmd!=null){System.out.println("ParameterCount:"+pmd.getParameterCount());}else{System.out.println("ParameterMetadatanotsupportedbythedatabase");}catch(SQLExceptionex1){System.err.println(ex1);}finally{try{pstmt.close();conn.close();}catch(SQLExceptionex2){}}}}RowSetMetaData接口是javax.sql包的一部分,它也是ResultSetMetaData接口的一个子实现。这种类型的对象提供有关RowSet对象中的列的信息。RowSet接口提供了支持JavaBeans组件模型的JDBCAPI的功能。因此,它具有支持JavaBeans事件通知方法的属性。RowSetMetadata提供有关RowSet对象中列的信息,可用于找出行集中包含的列数,或每列包含的数据类型。了解RowSet对象的工作机制对于充分理解RowSetMetaData的使用至关重要。描述行集机制超出了本文的范围;然而,读者可能会喜欢这篇文章《使用JDBC RowSet API》(http://www.developer.com/java/working-with-the-jdbc-rowset-api.html),获取RowsetAPI的概述。不过,这并不妨碍我们简单了解一下RowSetMetaData的实际使用。简单示例packageorg.mano.example;importjava.sql.SQLException;importjavax.sql.RowSetMetaData;importjavax.sql.rowset.WebRowSet;importcom.sun.rowset.WebRowSetImpl;publicclassRowSetMetaDataDemo{privatestaticfinalStringURL="jdbc:mysql://localhost:3306/addressbook?zeroDateTimeBehavior=convertToNull";privatestaticfinalStringUSERNAME="testuser";privatestaticfinalStringPASSWORD="secret";privatestaticfinalStringSQL="SELECT*FROMAddresses";publicstaticvoidmain(String[]args){WebRowSetrowSet=null;RowSetMetaDatarsmd=null;try{Class.forName("com.mysql.jdbc.Driver");rowSet=newWebRowSetImpl();rowSet.setUrl(URL);rowSet.setUsername(用户名);rowSet.setPassword(密码);rowSet.setCommand(SQL);rowSet.execute();rsmd=(RowSetMetaData)rowSet.getMetaData();if(rsmd!=null){intcount=rsmd.getColumnCount();for(inti=1;i<=count;i++)System.out.println("ColumnName:"+rsmd.getColumnName(i)+"类型:"+rsmd.getColumnTypeName(i));}else{System.out.println("RowSetMetadatanotsupported");}}catch(ClassNotFoundException|SQLExceptionex1){System.err.println(ex1);}最后{try{rowSet.close();}catch(SQLExceptionex2){}}}}结论使用这些示例作为尝试JDC元数据API的起点。JDBC元数据API对于创建大多数商业数据库应用程序是必不可少的。它们对于创建自定义数据库解决方案特别有用,例如生成基于GUI的数据浏览器应用程序。例如,您可以根据从数据库中检索到的元数据信息动态创建基于GUI的表结构。有关API及其功能的更多信息,请参阅JavaAPI文档。原标题:DiscoveringDatabaseMetadatawiththeJDBCMetadataAPI原作者:ManojDebnath