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

【】元数据基本上是指这类数据,提供关于其他一些数据的结构化描述。从程序员的角度来看,数据库元数据是指关于数据库数据的数据,或者更准确地说,是关于表、视图、列类型、列名称、结果集、存储过程和数据库的信息。Java的JDBC元数据API提供了通过Java代码检索该信息的手段。Java元数据信息尤其有助于编写可以适应几个数据库系统或适应任何数据库内容的代码。这意味着,创建一类泛型接口,使用高级数据库功能,在运行时发现数据库元数据。本文试图探究JDBC元数据API的一些关键特性,以便有助于发现数据库元数据。

元数据的使用

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

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

JDBC概况

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

 

 

图1:JDBC概况

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

JDBC元数据API

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

DatabaseMetaData

该接口通常由数据库厂商来实施,与原生JDBC驱动程序一道提供。原生JDBC驱动程序建立在数据库上面。通过实施该接口,数据库厂商提供了关于整个数据库的综合信息,比如表名称、索引、产品名称和版本等信息。该接口中声明了许多方法,以便检索与数据库有关的各种元数据信息。

简短例子

  1. package org.mano.example; 
  2.  
  3. import java.sql.Connection; 
  4. import java.sql.DatabaseMetaData; 
  5. import java.sql.DriverManager; 
  6. import java.sql.SQLException; 
  7.  
  8. public class DatabaseMetaDataDemo { 
  9.  
  10.    private static final String URL = 
  11.       "jdbc:mysql://localhost:3306/addressbook? 
  12.       zeroDateTimeBehavior=convertToNull"; 
  13.    private static final String USERNAME = "testuser"
  14.    private static final String PASSWORD = "secret"
  15.  
  16.    public static void main(String[] args) { 
  17.       Connection conn = null
  18.       DatabaseMetaData dbmd = null
  19.       try { 
  20.          conn = DriverManager.getConnection(URL, USERNAME, 
  21.             PASSWORD); 
  22.          dbmd = conn.getMetaData(); 
  23.          if (dbmd != null) { 
  24.             System.out.println("Database Version: " + 
  25.                dbmd.getDatabaseProductVersion()); 
  26.             System.out.println("Driver Name: " + 
  27.                dbmd.getDriverName()); 
  28.             System.out.println("Driver Version: " + 
  29.                dbmd.getDriverVersion()); 
  30.             System.out.println("URL: " + 
  31.                dbmd.getURL()); 
  32.             System.out.println("User Name: " + 
  33.                dbmd.getUserName()); 
  34.             System.out.println( 
  35.                (dbmd.supportsANSI92FullSQL() ? 
  36.                "ANSI92FullSQL supported." : 
  37.                "ANSI92FullSQL not supported.")); 
  38.             System.out.println( 
  39.                (dbmd.supportsTransactions() ? 
  40.                "Transaction supported." : 
  41.                "Transaction not supported.")); 
  42.          } else { 
  43.             System.out.println("Metadata not supported"); 
  44.          } 
  45.       } catch (SQLException ex1) { 
  46.          System.err.println(ex1); 
  47.       } finally { 
  48.          try { 
  49.             conn.close(); 
  50.          } catch (SQLException ex2) { 
  51.  
  52.          } 
  53.       } 
  54.    } 

ResultSetMetaData

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

简短例子

  1. package org.mano.example; 
  2.  
  3. import java.sql.Connection; 
  4. import java.sql.DriverManager; 
  5. import java.sql.ResultSet; 
  6. import java.sql.ResultSetMetaData; 
  7. import java.sql.SQLException; 
  8. import java.sql.Statement; 
  9.  
  10. public class ResultSetMetaDataDemo { 
  11.  
  12.    private static final String URL = 
  13.       "jdbc:mysql://localhost:3306/addressbook? 
  14.       zeroDateTimeBehavior=convertToNull"; 
  15.    private static final String USERNAME = "testuser"
  16.    private static final String PASSWORD = "secret"
  17.    private static final String SQL = 
  18.       "SELECT * FROM Addresses"
  19.  
  20.    public static void main(String[] args) { 
  21.       Connection conn = null
  22.       Statement stmt = null
  23.       ResultSet rs = null
  24.       ResultSetMetaData rsmd = null
  25.  
  26.       try { 
  27.          conn = DriverManager.getConnection(URL, 
  28.             USERNAME, PASSWORD); 
  29.          stmt = conn.createStatement(); 
  30.          rs = stmt.executeQuery(SQL); 
  31.          rsrsmd = rs.getMetaData(); 
  32.  
  33.          if (rsmd != null) { 
  34.             int cols = rsmd.getColumnCount(); 
  35.             System.out.println("Number of Columns: " + cols); 
  36.             System.out.println("Table Name: " + 
  37.                rsmd.getTableName(1)); 
  38.             System.out.println("Catalog Name: " + 
  39.                rsmd.getCatalogName(1)); 
  40.             System.out.println 
  41.                ("------------------------------------------"); 
  42.             for (int i = 1; i <= cols; i++) { 
  43.                System.out.println("Class Name: " + 
  44.                   rsmd.getColumnClassName(i)); 
  45.                System.out.println("Column Name: " + 
  46.                   rsmd.getColumnName(i)); 
  47.                System.out.println("Column Type Name: " + 
  48.                   rsmd.getColumnTypeName(i)); 
  49.                System.out.println 
  50.                   ("--------------------------------------"); 
  51.             } 
  52.          } else { 
  53.             System.out.println("ResultSetMetadata not supported"); 
  54.          } 
  55.  
  56.       } catch (SQLException ex1) { 
  57.          System.err.println(ex1); 
  58.       } finally { 
  59.          try { 
  60.             stmt.close(); 
  61.             rs.close(); 
  62.             conn.close(); 
  63.          } catch (SQLException ex2) { 
  64.  
  65.          } 
  66.       } 
  67.    } 

ParameterMetaData

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

简短例子

  1. package org.mano.example; 
  2.  
  3. import java.sql.Connection; 
  4. import java.sql.DriverManager; 
  5. import java.sql.ParameterMetaData; 
  6. import java.sql.PreparedStatement; 
  7. import java.sql.SQLException; 
  8.  
  9. public class ParameterMetaDataDemo { 
  10.  
  11.    private static final String URL = "jdbc:mysql://localhost:3306/ 
  12.       addressbook?zeroDateTimeBehavior=convertToNull"; 
  13.    private static final String USERNAME = "testuser"
  14.    private tatic final String PASSWORD = "secret"
  15.    private static final String SQL = "SELECT id, firstName, lastName 
  16.       FROM Addresses WHERE id=? AND firstName LIKE ?"; 
  17.  
  18.    public static void main(String[] args) { 
  19.  
  20.       Connection conn = null
  21.       PreparedStatement pstmt = null
  22.       ParameterMetaData pmd = null
  23.  
  24.       try { 
  25.          conn = DriverManager.getConnection(URL, 
  26.             USERNAME, PASSWORD); 
  27.          pstmt = conn.prepareStatement(SQL); 
  28.          pmd = pstmt.getParameterMetaData(); 
  29.          if (pmd != null) { 
  30.             System.out.println("Parameter Count: " + 
  31.                pmd.getParameterCount()); 
  32.          } else { 
  33.             System.out.println("ParameterMetadata not 
  34.                supported by the database"); 
  35.          } 
  36.  
  37.       catch (SQLException ex1) { 
  38.          System.err.println(ex1); 
  39.       } finally { 
  40.          try { 
  41.             pstmt.close(); 
  42.             conn.close(); 
  43.          } catch (SQLException ex2) { 
  44.  
  45.          } 
  46.       } 
  47.    } 

RowSetMetaData接口是javax.sql程序包的一部分,也是ResultSetMetaData接口的子实现。这类对象提供了RowSet对象中列的信息。RowSet接口为JavaBeans组件模型提供了支持JDBC API的功能。因而,它有属性,可支持JavaBeans事件通知方法。RowSetMetadata提供了关于RowSet对象中列的信息,可以用来查明行集中所含列的数量,或每一列所含数据的类型。了解RowSet对象的工作机制至关重要,以便完全了解RowSetMetaData的使用。描述rowset机制不在本文探讨范围之内;不过,读者可能会喜欢这篇文章《使用JDBC RowSet API》(http://www.developer.com/java/working-with-the-jdbc-rowset-api.html),大致了解Rowset API。然而,这并不阻止我们大致看一下RowSetMetaData的实际使用。

简短例子

  1. package org.mano.example; 
  2.  
  3. import java.sql.SQLException; 
  4.  
  5. import javax.sql.RowSetMetaData; 
  6. import javax.sql.rowset.WebRowSet; 
  7.  
  8. import com.sun.rowset.WebRowSetImpl; 
  9.  
  10. public class RowSetMetaDataDemo { 
  11.  
  12.    private static final String URL = "jdbc:mysql://localhost:3306/ 
  13.       addressbook?zeroDateTimeBehavior=convertToNull"; 
  14.    private static final String USERNAME = "testuser"
  15.    private static final String PASSWORD = "secret"
  16.    private static final String SQL = "SELECT * FROM Addresses"
  17.  
  18.    public static void main(String[] args) { 
  19.       WebRowSet rowSet = null
  20.       RowSetMetaData rsmd = null
  21.  
  22.       try { 
  23.          Class.forName("com.mysql.jdbc.Driver"); 
  24.          rowSet = new WebRowSetImpl(); 
  25.          rowSet.setUrl(URL); 
  26.          rowSet.setUsername(USERNAME); 
  27.          rowSet.setPassword(PASSWORD); 
  28.          rowSet.setCommand(SQL); 
  29.          rowSet.execute(); 
  30.  
  31.          rsmd = (RowSetMetaData) rowSet.getMetaData(); 
  32.          if (rsmd != null) { 
  33.  
  34.             int count = rsmd.getColumnCount(); 
  35.             for (int i = 1; i <= count; i++) 
  36.                System.out.println("Column Name: " + 
  37.                   rsmd.getColumnName(i) + 
  38.                   " Type: " + rsmd.getColumnTypeName(i)); 
  39.          } else { 
  40.             System.out.println("RowSetMetadata not supported"); 
  41.          } 
  42.  
  43.       } catch (ClassNotFoundException | SQLException ex1) { 
  44.          System.err.println(ex1); 
  45.       } finally { 
  46.          try { 
  47.             rowSet.close(); 
  48.          } catch (SQLException ex2) { 
  49.  
  50.          } 
  51.       } 
  52.    } 

结束语

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

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

原文作者:Manoj Debnath

【译稿,合作站点转载请注明原文译者和出处为.com】

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/241256.html<

(0)
运维的头像运维
上一篇2025-04-24 06:16
下一篇 2025-04-24 06:17

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注