日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
借助JDBC元數(shù)據(jù)API,發(fā)現(xiàn)數(shù)據(jù)庫(kù)元數(shù)據(jù)

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

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

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

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

JDBC概況

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

圖1:JDBC概況

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

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

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

DatabaseMetaData

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

簡(jiǎn)短例子

   
   
   
   
  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對(duì)象結(jié)構(gòu)的元數(shù)據(jù)信息,比如搞清楚列數(shù)量、名稱、類型和長(zhǎng)度、表名稱、列是可讀/可寫還是可搜索等。

簡(jiǎn)短例子

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

簡(jiǎn)短例子

 
 
 
 
  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接口的子實(shí)現(xiàn)。這類對(duì)象提供了RowSet對(duì)象中列的信息。RowSet接口為JavaBeans組件模型提供了支持JDBC API的功能。因而,它有屬性,可支持JavaBeans事件通知方法。RowSetMetadata提供了關(guān)于RowSet對(duì)象中列的信息,可以用來(lái)查明行集中所含列的數(shù)量,或每一列所含數(shù)據(jù)的類型。了解RowSet對(duì)象的工作機(jī)制至關(guān)重要,以便完全了解RowSetMetaData的使用。描述rowset機(jī)制不在本文探討范圍之內(nèi);不過(guò),讀者可能會(huì)喜歡這篇文章《使用JDBC RowSet API》(http://www.developer.com/java/working-with-the-jdbc-rowset-api.html),大致了解Rowset API。然而,這并不阻止我們大致看一下RowSetMetaData的實(shí)際使用。

簡(jiǎn)短例子

 
 
 
 
  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é)束語(yǔ)

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


當(dāng)前標(biāo)題:借助JDBC元數(shù)據(jù)API,發(fā)現(xiàn)數(shù)據(jù)庫(kù)元數(shù)據(jù)
本文網(wǎng)址:http://www.dlmjj.cn/article/djcsieo.html