麒麟v10 上部署 TiDB v5.1.2 生产环境优化实践
1018
2023-04-28
借助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小时内删除侵权内容。