借助JDBC元数据API,发现数据库元数据

网友投稿 1018 2023-04-28

借助JDBC元数据API,发现数据库元数据

借助JDBC元数据API,发现数据库元数据

元数据的使用

JDBC元数据API可用于检索关于数据库的下列信息:

数据库用户、表、视图和存储过程数据库模式和目录信息表、视图和列权限关于表的主密钥或外来密钥的信息

JDBC概况

JDBC为客户机应用程序提供了必要的API,以便借助元数据类,发现关于数据库和任何特定结果集(ResultSet)的信息。

图1:JDBC概况

API涉及为客户机提供元数据信息服务的几个接口。客户机通过JDBC驱动程序管理器(JDBC Driver Manager),检索该信息。驱动程序管理器充当实际数据库和API之间的接口。针对特定厂商的数据库提供了自己的Java驱动程序(类型4驱动程序)。比如说,MySQL提供了Connector/J;甲骨文或***等其他数据库有各自的JDBC驱动程序。在数据库厂商不提供任何驱动程序(类型4)的情况下,Java IDBC/ODBC Bridge可充当底层ODBC驱动程序和驱动程序管理器之间的中介。不管在什么情况下,检索数据库元数据信息的方法都是一样的。

JDBC元数据API

JDBC API提供了检索元数据信息的两个关键接口:DatabaseMetaData和ResultSetMetaData。这两个接口是java.sql程序包的一部分。DatabaseMetaData主要用于检索关于数据库的信息,比如其功能和结构。另一方面,ResultSetMetaData用于获得关于SQL查询的信息,比如关于其大小和列类型的信息。所以,JDBC元数据API的关键要素如下:

DatabaseMetaData

简短例子

package org.mano.example;  import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.DriverManager; import java.sql.SQLException;  public class DatabaseMetaDataDemo {     private static final String URL =       "jdbc:mysql://localhost:3306/addressbook?       zeroDateTimeBehavior=convertToNull";    private static final String USERNAME = "testuser";    private static final String PASSWORD = "secret";     public static void main(String[] args) {       Connection conn = null;       DatabaseMetaData dbmd = null;       try {          conn = DriverManager.getConnection(URL, USERNAME,             PASSWORD);          dbmd = conn.getMetaData();          if (dbmd != null) {             System.out.println("Database Version: " +                dbmd.getDatabaseProductVersion());             System.out.println("Driver Name: " +                dbmd.getDriverName());             System.out.println("Driver Version: " +                dbmd.getDriverVersion());             System.out.println("URL: " +                dbmd.getURL());             System.out.println("User Name: " +                dbmd.getUserName());             System.out.println(                (dbmd.supportsANSI92FullSQL() ?                "ANSI92FullSQL supported." :                "ANSI92FullSQL not supported."));             System.out.println(                (dbmd.supportsTransactions() ?                "Transaction supported." :                "Transaction not supported."));          } else {             System.out.println("Metadata not supported");          }       } catch (SQLException ex1) {          System.err.println(ex1);       } finally {          try {             conn.close();          } catch (SQLException ex2) {           }       }    } }

ResultSetMetaData

该接口提供了关于ResultSet对象结构的元数据信息,比如搞清楚列数量、名称、类型和长度、表名称、列是可读/可写还是可搜索等。

简短例子

package org.mano.example;  import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement;  public class ResultSetMetaDataDemo {     private static final String URL =       "jdbc:mysql://localhost:3306/addressbook?       zeroDateTimeBehavior=convertToNull";    private static final String USERNAME = "testuser";    private static final String PASSWORD = "secret";    private static final String SQL =       "SELECT * FROM Addresses";     public static void main(String[] args) {       Connection conn = null;       Statement stmt = null;       ResultSet rs = null;       ResultSetMetaData rsmd = null;        try {          conn = DriverManager.getConnection(URL,             USERNAME, PASSWORD);          stmt = conn.createStatement();          rs = stmt.executeQuery(SQL);          rsrsmd = rs.getMetaData();           if (rsmd != null) {             int cols = rsmd.getColumnCount();             System.out.println("Number of Columns: " + cols);             System.out.println("Table Name: " +                rsmd.getTableName(1));             System.out.println("Catalog Name: " +                rsmd.getCatalogName(1));             System.out.println                ("------------------------------------------");             for (int i = 1; i <= cols; i++) {                System.out.println("Class Name: " +                   rsmd.getColumnClassName(i));                System.out.println("Column Name: " +                   rsmd.getColumnName(i));                System.out.println("Column Type Name: " +                   rsmd.getColumnTypeName(i));                System.out.println                   ("--------------------------------------");             }          } else {             System.out.println("ResultSetMetadata not supported");          }        } catch (SQLException ex1) {          System.err.println(ex1);       } finally {          try {             stmt.close();             rs.close();             conn.close();          } catch (SQLException ex2) {           }       }    } }

ParameterMetaData

ParameterMetadata对象用来检索关于PreparedStatement对象中参数标记的信息。元数据信息是指所用参数的类型和属性,比如获得完全合格的Java类名称、参数数量、类型、列大小确定的指定精度等。

简短例子

package org.mano.example;  import java.sql.Connection; import java.sql.DriverManager; import java.sql.ParameterMetaData; import java.sql.PreparedStatement; import java.sql.SQLException;  public class ParameterMetaDataDemo {     private static final String URL = "jdbc:mysql://localhost:3306/       addressbook?zeroDateTimeBehavior=convertToNull";    private static final String USERNAME = "testuser";    private tatic final String PASSWORD = "secret";    private static final String SQL = "SELECT id, firstName, lastName       FROM Addresses WHERE id=? AND firstName LIKE ?";     public static void main(String[] args) {        Connection conn = null;       PreparedStatement pstmt = null;       ParameterMetaData pmd = null;        try {          conn = DriverManager.getConnection(URL,             USERNAME, PASSWORD);          pstmt = conn.prepareStatement(SQL);          pmd = pstmt.getParameterMetaData();          if (pmd != null) {             System.out.println("Parameter Count: " +                pmd.getParameterCount());          } else {             System.out.println("ParameterMetadata not                supported by the database");          }        catch (SQLException ex1) {          System.err.println(ex1);       } finally {          try {             pstmt.close();             conn.close();          } catch (SQLException ex2) {           }       }    } }

简短例子

结束语

以这些例子作为一个出发点,以此试用JDC元数据API。JDBC元数据API是创建大多数商业数据库应用程序所必不可少的。它们尤其适用于创建定制的数据库解决方案,比如生成基于GUI的数据浏览器应用程序。比如说,你可以根据从数据库检索的元数据信息,动态创建一个基于GUI的表结构。想了解关于API及其功能的更多信息,请参阅Java API说明文档。

原文标题:Discovering Database Metadata with the JDBC Metadata API

原文作者:Manoj Debnath

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Linux系统下安装MySQL的步骤详解
下一篇:成功数据集成策略中的八项关键性元素
相关文章