自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

借助JDBC元數(shù)據(jù)API,發(fā)現(xiàn)數(shù)據(jù)庫元數(shù)據(jù)

譯文
數(shù)據(jù)庫 MySQL
本文試圖探究JDBC元數(shù)據(jù)API的一些關(guān)鍵特性,以便有助于發(fā)現(xiàn)數(shù)據(jù)庫元數(shù)據(jù)。

【51CTO.com快譯】元數(shù)據(jù)基本上是指這類數(shù)據(jù),提供關(guān)于其他一些數(shù)據(jù)的結(jié)構(gòu)化描述。從程序員的角度來看,數(shù)據(jù)庫元數(shù)據(jù)是指關(guān)于數(shù)據(jù)庫數(shù)據(jù)的數(shù)據(jù),或者更準(zhǔn)確地說,是關(guān)于表、視圖、列類型、列名稱、結(jié)果集、存儲過程和數(shù)據(jù)庫的信息。Java的JDBC元數(shù)據(jù)API提供了通過Java代碼檢索該信息的手段。Java元數(shù)據(jù)信息尤其有助于編寫可以適應(yīng)幾個數(shù)據(jù)庫系統(tǒng)或適應(yīng)任何數(shù)據(jù)庫內(nèi)容的代碼。這意味著,創(chuàng)建一類泛型接口,使用高級數(shù)據(jù)庫功能,在運行時發(fā)現(xiàn)數(shù)據(jù)庫元數(shù)據(jù)。本文試圖探究JDBC元數(shù)據(jù)API的一些關(guān)鍵特性,以便有助于發(fā)現(xiàn)數(shù)據(jù)庫元數(shù)據(jù)。

元數(shù)據(jù)的使用

JDBC元數(shù)據(jù)API可用于檢索關(guān)于數(shù)據(jù)庫的下列信息:

  • 數(shù)據(jù)庫用戶、表、視圖和存儲過程
  • 數(shù)據(jù)庫模式和目錄信息
  • 表、視圖和列權(quán)限
  • 關(guān)于表的主密鑰或外來密鑰的信息

JDBC概況

JDBC為客戶機應(yīng)用程序提供了必要的API,以便借助元數(shù)據(jù)類,發(fā)現(xiàn)關(guān)于數(shù)據(jù)庫和任何特定結(jié)果集(ResultSet)的信息。

 

 

圖1:JDBC概況

API涉及為客戶機提供元數(shù)據(jù)信息服務(wù)的幾個接口??蛻魴C通過JDBC驅(qū)動程序管理器(JDBC Driver Manager),檢索該信息。驅(qū)動程序管理器充當(dāng)實際數(shù)據(jù)庫和API之間的接口。針對特定廠商的數(shù)據(jù)庫提供了自己的Java驅(qū)動程序(類型4驅(qū)動程序)。比如說,MySQL提供了Connector/J;甲骨文或PostgreSQL等其他數(shù)據(jù)庫有各自的JDBC驅(qū)動程序。在數(shù)據(jù)庫廠商不提供任何驅(qū)動程序(類型4)的情況下,Java IDBC/ODBC Bridge可充當(dāng)?shù)讓覱DBC驅(qū)動程序和驅(qū)動程序管理器之間的中介。不管在什么情況下,檢索數(shù)據(jù)庫元數(shù)據(jù)信息的方法都是一樣的。

JDBC元數(shù)據(jù)API

JDBC API提供了檢索元數(shù)據(jù)信息的兩個關(guān)鍵接口:DatabaseMetaData和ResultSetMetaData。這兩個接口是java.sql程序包的一部分。DatabaseMetaData主要用于檢索關(guān)于數(shù)據(jù)庫的信息,比如其功能和結(jié)構(gòu)。另一方面,ResultSetMetaData用于獲得關(guān)于SQL查詢的信息,比如關(guān)于其大小和列類型的信息。所以,JDBC元數(shù)據(jù)API的關(guān)鍵要素如下:

DatabaseMetaData

該接口通常由數(shù)據(jù)庫廠商來實施,與原生JDBC驅(qū)動程序一道提供。原生JDBC驅(qū)動程序建立在數(shù)據(jù)庫上面。通過實施該接口,數(shù)據(jù)庫廠商提供了關(guān)于整個數(shù)據(jù)庫的綜合信息,比如表名稱、索引、產(chǎn)品名稱和版本等信息。該接口中聲明了許多方法,以便檢索與數(shù)據(jù)庫有關(guān)的各種元數(shù)據(jù)信息。

簡短例子

  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

該接口提供了關(guān)于ResultSet對象結(jié)構(gòu)的元數(shù)據(jù)信息,比如搞清楚列數(shù)量、名稱、類型和長度、表名稱、列是可讀/可寫還是可搜索等。

簡短例子

  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對象用來檢索關(guān)于PreparedStatement對象中參數(shù)標(biāo)記的信息。元數(shù)據(jù)信息是指所用參數(shù)的類型和屬性,比如獲得完全合格的Java類名稱、參數(shù)數(shù)量、類型、列大小確定的指定精度等。

簡短例子

  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接口的子實現(xiàn)。這類對象提供了RowSet對象中列的信息。RowSet接口為JavaBeans組件模型提供了支持JDBC API的功能。因而,它有屬性,可支持JavaBeans事件通知方法。RowSetMetadata提供了關(guān)于RowSet對象中列的信息,可以用來查明行集中所含列的數(shù)量,或每一列所含數(shù)據(jù)的類型。了解RowSet對象的工作機制至關(guān)重要,以便完全了解RowSetMetaData的使用。描述rowset機制不在本文探討范圍之內(nèi);不過,讀者可能會喜歡這篇文章《使用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.    } 

結(jié)束語

以這些例子作為一個出發(fā)點,以此試用JDC元數(shù)據(jù)API。JDBC元數(shù)據(jù)API是創(chuàng)建大多數(shù)商業(yè)數(shù)據(jù)庫應(yīng)用程序所必不可少的。它們尤其適用于創(chuàng)建定制的數(shù)據(jù)庫解決方案,比如生成基于GUI的數(shù)據(jù)瀏覽器應(yīng)用程序。比如說,你可以根據(jù)從數(shù)據(jù)庫檢索的元數(shù)據(jù)信息,動態(tài)創(chuàng)建一個基于GUI的表結(jié)構(gòu)。想了解關(guān)于API及其功能的更多信息,請參閱Java API說明文檔。

原文標(biāo)題:Discovering Database Metadata with the JDBC Metadata API

原文作者:Manoj Debnath

【51CTO譯稿,合作站點轉(zhuǎn)載請注明原文譯者和出處為51CTO.com】

責(zé)任編輯:陶家龍 來源: 51CTO
相關(guān)推薦

2022-03-16 11:03:40

數(shù)據(jù)庫元數(shù)據(jù)數(shù)據(jù)引擎

2010-12-27 16:18:59

本地元數(shù)據(jù)庫

2021-09-27 23:58:55

數(shù)據(jù)庫分層設(shè)計

2021-09-01 14:36:14

鴻蒙HarmonyOS應(yīng)用

2009-07-20 10:48:08

JDBC API

2021-09-01 10:37:25

鴻蒙HarmonyOS應(yīng)用

2023-02-27 15:46:19

數(shù)據(jù)元元數(shù)據(jù)

2009-07-06 17:23:34

JDBC連接數(shù)據(jù)庫

2009-07-16 17:22:56

JDBC數(shù)據(jù)庫編程

2023-05-29 16:51:06

2009-11-09 17:30:20

WCF元數(shù)據(jù)

2022-05-26 10:04:46

Druid元數(shù)據(jù)數(shù)據(jù)庫

2021-04-25 19:00:55

大數(shù)據(jù)視頻分析人工智能

2011-05-26 09:27:59

JDBC連接數(shù)據(jù)庫

2011-05-26 13:54:42

數(shù)據(jù)庫JDBC連接

2023-09-04 18:57:01

API接口數(shù)據(jù)中心

2010-06-04 09:33:28

連接MySQL數(shù)據(jù)庫

2009-07-14 17:18:23

JDBC怎么連接數(shù)據(jù)庫

2009-07-20 15:56:08

JDBC連接數(shù)據(jù)庫步驟

2009-07-07 17:42:28

點贊
收藏

51CTO技術(shù)棧公眾號