操作元數據 – JAVA編程語言程序開發技術文章

JDBC Meta Data(元數據)—-描述數據的數據。它的接口有:

n DatabaseMetaData(數據庫元數據)

n ResultSetMetaData(結果集元數據)

DatabaseMetaData(數據庫元數據)

在對數據源進行連接以後,得到一個Connection對象,可以從這個對象獲得有關數據源的各種信息,包括關於數據庫中的各個表,表中的各個列,數據類型和存儲過程等各方面的信息。根據這些信息,JDBC程序可以訪問一個事先並不瞭解的數據庫。獲取這些信息的方法都是在DatabaseMetaData的對象上實現的,而DatabaseMetaData對象是在Connection對象之上獲得的。

下面的語句可以在一個連接的基礎上創建一個DatabaseMetaData 對象:

DatabaseMetaData dm=con.getMetaData();

數據庫的一些常用信息可通過DatabaseMetaData對象的下列方法獲得。

n  getURL()//返回一個String對象,代表數據庫的URL.

n  getUserName()//返回此連接使用的數據庫的用戶名

n  isReadOnly()//返回一個boolean值,指示數據庫是否隻允許讀操作。

n getDatabaseProduceName()//返回數據庫的產品名稱

n getDatabaseProduceVersion()//返回數據庫的版本號

n  getDriverName()//返回驅動程序的名稱。

n getDriverVersion()//返回驅動程序的版本號

代碼示例:

[java]
import java.sql.Connection; 
import java.sql.DatabaseMetaData; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import javax.naming.NamingException; 
 
public class DataBaseMetaDataTest { 
    public static void main(String[] args) { 
        Connection con = null; 
        String jndiname = "jdbcPool/mydatasource"; 
        try { 
            con = DBCon.getConnectionFromPooledDataSource(jndiname); 
            // 測試數據庫信息  
            DatabaseMetaData dm = con.getMetaData(); 
            System.out.println("1. 數據庫的基本信息"); 
            System.out.println("Database is " + dm.getDatabaseProductName()); 
            System.out.println("Database version is " 
                    + dm.getDatabaseProductVersion()); 
            System.out.println("JDBC Driver is " + dm.getDriverName()); 
            System.out.println("JDBC driver version is " 
                    + dm.getDriverVersion()); 
            // 獲取數據庫中目錄(數據庫)的信息  
            System.out.println("2. 數據庫中目錄(數據庫)的信息"); 
            ResultSet catalogs = dm.getCatalogs(); 
            while (catalogs.next()) { 
                System.out.println(catalogs.getString(1)); 
            } 
            // 獲取數據庫中模式的信息  
            System.out.println("3. 數據庫中模式的信息"); 
            ResultSet schemas = dm.getSchemas(); 
            while (schemas.next()) { 
                System.out.println(schemas.getString(1)); 
            } 
            // 獲取數據庫中各個表的情況  
            System.out.println("4. 數據庫中各個表的信息"); 
            ResultSet tables = dm.getTables("pubs", null, null, null); 
            while (tables.next()) { 
                for (int i = 0; i < 5; i++) { 
                    System.out.print(tables.getString(i + 1)); 
                    System.out.print("  |  "); 
                } 
                System.out.println(); 
            } 
            // 獲取數據庫表中各個列的信息  
            System.out.println("5. 數據庫表中各個列的信息"); 
            ResultSet columns = dm.getColumns(null, null,  
    "student", null); 
            while (columns.next()) { 
                for (int i = 0; i < 18; i++) { 
                    System.out.print(columns.getString(i + 1)); 
                    System.out.print("  |  "); 
                } 
                System.out.println(); 
            } 
        } catch (NamingException ex) { 
            System.err.println("Name Not Bound : " + ex.getMessage()); 
        } catch (SQLException ex) { 
            System.err.println("SQLException : " + ex.getMessage()); 
        } finally { 
            try { 
                if (con != null) 
                    con.close(); 
            } catch (Exception e) { 
                e.printStackTrace(); 
            } 
        } 
        System.out.println("程序結束!!!"); 
    } 

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.naming.NamingException;

public class DataBaseMetaDataTest {
 public static void main(String[] args) {
  Connection con = null;
  String jndiname = "jdbcPool/mydatasource";
  try {
   con = DBCon.getConnectionFromPooledDataSource(jndiname);
   // 測試數據庫信息www.aiwalls.com
   DatabaseMetaData dm = con.getMetaData();
   System.out.println("1. 數據庫的基本信息");
   System.out.println("Database is " + dm.getDatabaseProductName());
   System.out.println("Database version is "
     + dm.getDatabaseProductVersion());
   System.out.println("JDBC Driver is " + dm.getDriverName());
   System.out.println("JDBC driver version is "
     + dm.getDriverVersion());
   // 獲取數據庫中目錄(數據庫)的信息
   System.out.println("2. 數據庫中目錄(數據庫)的信息");
   ResultSet catalogs = dm.getCatalogs();
   while (catalogs.next()) {
    System.out.println(catalogs.getString(1));
   }
   // 獲取數據庫中模式的信息
   System.out.println("3. 數據庫中模式的信息");
   ResultSet schemas = dm.getSchemas();
   while (schemas.next()) {
    System.out.println(schemas.getString(1));
   }
   // 獲取數據庫中各個表的情況
   System.out.println("4. 數據庫中各個表的信息");
   ResultSet tables = dm.getTables("pubs", null, null, null);
   while (tables.next()) {
    for (int i = 0; i < 5; i++) {
     System.out.print(tables.getString(i + 1));
     System.out.print("  |  ");
    }
    System.out.println();
   }
   // 獲取數據庫表中各個列的信息
   System.out.println("5. 數據庫表中各個列的信息");
   ResultSet columns = dm.getColumns(null, null,
 "student", null);
   while (columns.next()) {
    for (int i = 0; i < 18; i++) {
     System.out.print(columns.getString(i + 1));
     System.out.print("  |  ");
    }
    System.out.println();
   }
  } catch (NamingException ex) {
   System.err.println("Name Not Bound : " + ex.getMessage());
  } catch (SQLException ex) {
   System.err.println("SQLException : " + ex.getMessage());
  } finally {
   try {
    if (con != null)
     con.close();
   } catch (Exception e) {
    e.printStackTrace();
   }
  }
  System.out.println("程序結束!!!");
 }
}

ResultSetMetaData(結果集元數據)

根據結果集的元數據,可以得到一個查詢結果集關於查詢表中列的個數,各個列名,類型以及各個列的寬度等。ResultSetMetaData的對象可以由ResultSet對象的getMetaData()方法得到。

ResultSetMetaData對象的常用方法如下:

n ResultSet rs=stmt.executeQuery();

n ResultSetMetaData rsmd=rs.getMetaData();

n rsmd.getColumnCount()//返回ResultSet對象的列數。

n rsmd.getColumnDisplaySize(int column);//返回column指定的列的最大寬度。

n rsmd.getColumnLabel(int column)//返回column指定列的標簽。

n rsmd.getColumnName(int column)//返回column指定列的列名。

請看下例:

[java]
import java.sql.Connection; 
import java.sql.ResultSet; 
import java.sql.ResultSetMetaData; 
import java.sql.SQLException; 
import java.sql.Statement; 
import javax.naming.NamingException; 
 
public class ResultSetMetaDataTest { 
    public static void main(String[] args) { 
        Statement stmt = null; 
        ResultSet rs = null; 
        Connection con = null; 
        String jndiname = "jdbcPool/mydatasource"; 
        try { 
            con = DBCon.getConnectionFromPooledDataSource(jndiname); 
            stmt = con.createStatement(); 
            String querySQL1 = "select * from student"; 
            rs = stmt.executeQuery(querySQL1); 
 
            // 提取結果集的元數據:  
            ResultSetMetaData rsmd = rs.getMetaData(); 
            int colCount = rsmd.getColumnCount(); 
            String[] columnNames = new String[colCount]; 
            String[] columnLabels = new String[colCount]; 
            int[] columnTypes = new int[colCount]; 
 
            for (int i = 0; i < colCount; i++) { 
                columnNames[i] = rsmd.getColumnName(i + 1); 
                columnLabels[i] = rsmd.getColumnLabel(i + 1); 
                columnTypes[i] = rsmd.getColumnType(i + 1); 
            } 
            System.out.println(); 
            System.out.println("提取的數據如下:"); 
            System.out.println(); 
 
            System.out  .println("———————-"); 
            for (int i = 0; i < colCount; i++) { 
                System.out.print(columnLabels[i] + "\t"); 
            } 
            System.out.println(); 
            for (int i = 0; i < colCount; i++) { 
                System.out.print(columnNames[i] + "\t"); 
            } 
        } catch (NamingException ex) { 
            System.err.println("Name Not Bound : " + ex.getMessage()); 
        } catch (SQLException ex) { 
            System.err.println("SQLException: " + ex.getMessage()); 
        } finally { 
            try { 
                if (con != null) 
                    con.close(); 
            } catch (Exception e) { 
 
            } 
        } 
        System.out.println("程序結束!!!"); 
    } 

 

摘自  Java教程
 

發佈留言