JDBC中DatabaseMetaData用法

DatabaseMetaData類中提供了許多方法用於獲得數據源的各種信息,通過這些方法可以非常詳細的瞭解數據庫的信息。就如我們上面例子中所顯示的幾個信息[其他的方法請讀者參考JDK API中的DatabaseMetaData類]:

getURL()

返回一個String類對象,代表數據庫的URL。

getUserName()

返回連接當前數據庫管理系統的用戶名。

isReadOnly()

返回一個boolean值,指示數據庫是否只允許讀操作。

getDatabaseProductName()

返回數據庫的產品名稱。

getDatabaseProductVersion()

返回數據庫的版本號。

getDriverName()

返回驅動驅動程序的名稱。

getDriverVersion()

返回驅動程序的版本號。


一、獲取數據庫表信息
getTables
ResultSet getTables(String catalog, String schemaPattern, String tableNamePattern, String[] types) throws SQLException
檢索可在給定類別中使用的表的描述。僅返回與類別、模式、表名稱和類型標準匹配的表描述。它們根據 TABLE_TYPE、TABLE_SCHEM 和 TABLE_NAME 進行排序。
每個表描述都有以下列:

TABLE_CAT String => 表類別(可爲 null)
TABLE_SCHEM String => 表模式(可爲 null)
TABLE_NAME String => 表名稱
TABLE_TYPE String => 表類型。典型的類型是 “TABLE”、”VIEW”、”SYSTEM TABLE”、”GLOBAL TEMPORARY”、”LOCAL TEMPORARY”、”ALIAS” 和 “SYNONYM”。
REMARKS String => 表的解釋性註釋
TYPE_CAT String => 類型的類別(可爲 null)
TYPE_SCHEM String => 類型模式(可爲 null)
TYPE_NAME String => 類型名稱(可爲 null)
SELF_REFERENCING_COL_NAME String => 有類型表的指定 “identifier” 列的名稱(可爲null)
REF_GENERATION String => 指定在 SELF_REFERENCING_COL_NAME 中創建值的方式。這些值爲 “SYSTEM”、”USER” 和 “DERIVED”。(可能爲null)
注: 有些數據庫可能不返回用於所有表的信息。

參數:
catalog - 類別名稱,因爲存儲在數據庫中,所以它必須匹配類別名稱。該參數爲 “” 則檢索沒有類別的描述,爲 null 則表示該類別名稱不應用於縮小搜索範圍
schemaPattern - 模式名稱的模式,因爲存儲在數據庫中,所以它必須匹配模式名稱。該參數爲 “” 則檢索那些沒有模式的描述,爲null 則表示該模式名稱不應用於縮小搜索範圍
tableNamePattern - 表名稱模式,因爲存儲在數據庫中,所以它必須匹配表名稱
types - 要包括的表類型組成的列表,null 表示返回所有類型
返回:
ResultSet - 每一行都是一個表描述
拋出:
SQLException - 如果發生數據庫訪問錯誤


二、獲取表中列信息

getColumns
ResultSet getColumns(String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern) throws SQLException

檢索可在指定類別中使用的表列的描述。

僅返回與類別、模式、表和列名稱標準匹配的列描述。它們根據 TABLE_SCHEM、TABLE_NAME 和ORDINAL_POSITION 進行排序。

每個列描述都有以下列:

TABLE_CAT String => 表類別(可爲 null)
TABLE_SCHEM String => 表模式(可爲 null)
TABLE_NAME String => 表名稱
COLUMN_NAME String => 列名稱
DATA_TYPE int => 來自 java.sql.Types 的 SQL 類型
TYPE_NAME String => 數據源依賴的類型名稱,對於 UDT,該類型名稱是完全限定的
COLUMN_SIZE int => 列的大小。對於 char 或 date 類型,列的大小是最大字符數,對於 numeric 和 decimal 類型,列的大小就是精度。
BUFFER_LENGTH 未被使用。
DECIMAL_DIGITS int => 小數部分的位數
NUM_PREC_RADIX int => 基數(通常爲 10 或 2)
NULLABLE int => 是否允許使用 NULL。
columnNoNulls - 可能不允許使用 NULL 值
columnNullable - 明確允許使用 NULL 值
columnNullableUnknown - 不知道是否可使用 null
REMARKS String => 描述列的註釋(可爲 null)
COLUMN_DEF String => 默認值(可爲 null)
SQL_DATA_TYPE int => 未使用
SQL_DATETIME_SUB int => 未使用
CHAR_OCTET_LENGTH int => 對於 char 類型,該長度是列中的最大字節數
ORDINAL_POSITION int => 表中的列的索引(從 1 開始)
IS_NULLABLE String => “NO” 表示明確不允許列使用 NULL 值,”YES” 表示可能允許列使用 NULL 值。空字符串表示沒人知道是否允許使用 null 值。
SCOPE_CATLOG String => 表的類別,它是引用屬性的作用域(如果 DATA_TYPE 不是 REF,則爲null)
SCOPE_SCHEMA String => 表的模式,它是引用屬性的作用域(如果 DATA_TYPE 不是 REF,則爲null)
SCOPE_TABLE String => 表名稱,它是引用屬性的作用域(如果 DATA_TYPE 不是 REF,則爲 null)
SOURCE_DATA_TYPE short => 不同類型或用戶生成 Ref 類型、來自 java.sql.Types 的 SQL 類型的源類型(如果 DATA_TYPE 不是 DISTINCT 或用戶生成的 REF,則爲null)
參數:
catalog - 類別名稱,因爲存儲在數據庫中,所以它必須匹配類別名稱。該參數爲 “” 則檢索沒有類別的描述,爲 null 則表示該類別名稱不應用於縮小搜索範圍
schemaPattern - 模式名稱的模式,因爲存儲在數據庫中,所以它必須匹配模式名稱。該參數爲 “” 則檢索那些沒有模式的描述,爲null 則表示該模式名稱不應用於縮小搜索範圍
tableNamePattern - 表名稱模式,因爲存儲在數據庫中,所以它必須匹配表名稱
columnNamePattern - 列名稱模式,因爲存儲在數據庫中,所以它必須匹配列名稱
返回:
ResultSet - 每一行都是一個列描述
拋出:
SQLException - 如果發生數據庫訪問錯誤
另請參見:
getSearchStringEscape()


三、表中主鍵信息

getPrimaryKeys
ResultSet getPrimaryKeys(String catalog, String schema, String table) throws SQLException
檢索對給定表的主鍵列的描述。它們根據 COLUMN_NAME 進行排序。

每個主鍵列描述都有以下列:

TABLE_CAT String => 表類別(可爲 null)
TABLE_SCHEM String => 表模式(可爲 null)
TABLE_NAME String => 表名稱
COLUMN_NAME String => 列名稱
KEY_SEQ short => 主鍵中的序列號
PK_NAME String => 主鍵的名稱(可爲 null)
參數:
catalog - 類別名稱,因爲存儲在數據庫中,所以它必須匹配類別名稱。該參數爲 “” 則檢索沒有類別的描述,爲 null 則表示該類別名稱不應用於縮小搜索範圍
schema - 模式名稱,因爲存儲在數據庫中,所以它必須匹配模式名稱。該參數爲 “” 則檢索那些沒有模式的描述,爲 null 則表示該模式名稱不應用於縮小搜索範圍
table - 表名稱,因爲存儲在數據庫中,所以它必須匹配表名稱
返回:
ResultSet - 每一行都是一個主鍵列描述
拋出:
SQLException - 如果發生數據庫訪問錯誤

public static void main(String[] args) {   

        //這裏沒有指定數據庫   
        String url = "jdbc:mysql://127.0.0.1:3306/";   
        String user = "root";   
        String pass = "";   
        try {   

            Class.forName("com.mysql.jdbc.Driver").newInstance();   
            Connection conn = DriverManager.getConnection(url, user, pass);   
            DatabaseMetaData metadata = conn.getMetaData();   
            System.out.println("數據庫已知的用戶: "+ metadata.getUserName());   
            System.out.println("數據庫的系統函數的逗號分隔列表: "+ metadata.getSystemFunctions());   
            System.out.println("數據庫的時間和日期函數的逗號分隔列表: "+ metadata.getTimeDateFunctions());   
            System.out.println("數據庫的字符串函數的逗號分隔列表: "+ metadata.getStringFunctions());   
            System.out.println("數據庫供應商用於 'schema' 的首選術語: "+ metadata.getSchemaTerm());   
            System.out.println("數據庫URL: " + metadata.getURL());   
            System.out.println("是否允許只讀:" + metadata.isReadOnly());   
            System.out.println("數據庫的產品名稱:" + metadata.getDatabaseProductName());   
            System.out.println("數據庫的版本:" + metadata.getDatabaseProductVersion());   
            System.out.println("驅動程序的名稱:" + metadata.getDriverName());   
            System.out.println("驅動程序的版本:" + metadata.getDriverVersion());   

            System.out.println();   
            System.out.println("數據庫中使用的表類型");   
            ResultSet rs = metadata.getTableTypes();   
            while (rs.next()) {   
                System.out.println(rs.getString(1));   
            }   
            rs.close();   

            System.out.println();   
            /**  
             * 獲取指定的數據庫的所有表的類型,getTables()的第一個參數就是數據庫名  
             * 因爲與MySQL連接時沒有指定,這裏加上,剩下的參數就可以爲null了  
             * 第二個參數是模式名稱的模式,但是輸出也是什麼都沒有。誰知道告訴我一聲  
             */  
            System.out.println("獲取指定的數據庫的所有表的類型");   
            ResultSet rs1 = metadata.getTables("ssi2bbs", null, null, null);   
            while (rs1.next()) {   
                System.out.println();   
                System.out.println("數據庫名:"+ rs1.getString(1));   
                System.out.println("表名: "+rs1.getString(3));   
                System.out.println("類型: "+rs1.getString(4));   
            }   
            rs1.close();   

            System.out.println();   
            System.out.println("獲取指定的數據庫的表的主鍵");   
            //獲取指定的數據庫的表的主鍵,第二個參數也是模式名稱的模式,使用null了   
            ResultSet rs2 = metadata.getPrimaryKeys("mysql", null, "db");   
            while (rs2.next()) {   
                System.out.println("主鍵名稱: "+ rs2.getString(4));   
            }   
            rs2.close();   

            System.out.println();   
            System.out.println("DatabaseMetaData.getIndexInfo()方法返回信息:");   
            ResultSet rs3 = metadata.getIndexInfo("ssi2bbs", null, "user", false, true);   
            while (rs3.next()) {   
                System.out.println("數據庫名: "+ rs3.getString(1));   
                System.out.println("表模式: "+ rs3.getString(2));   
                System.out.println("表名稱: "+ rs3.getString(3));   
                System.out.println("索引值是否可以不唯一: "+ rs3.getString(4));   
                System.out.println("索引類別: "+ rs3.getString(5));   
                System.out.println("索引名稱: "+ rs3.getString(6));   
                System.out.println("索引類型: "+ rs3.getString(7));   
                System.out.println("索引中的列序列號: "+ rs3.getString(8));   
                System.out.println("列名稱: "+ rs3.getString(9));   
                System.out.println("列排序序列: "+ rs3.getString(10));   
                System.out.println("TYPE爲 tableIndexStatistic時它是表中的行數否則它是索引中唯一值的數量: "+ rs3.getString(11));   
                System.out.println("TYPE爲 tableIndexStatisic時它是用於表的頁數否則它是用於當前索引的頁數: "+ rs3.getString(12));   
                System.out.println("過濾器條件: "+ rs3.getString(13));   
            }   
            rs3.close();   

        } catch (Exception e) {   
            e.printStackTrace();   
        }   
    }  

ResultSetMetaData接口, 用於獲取關於ResultSet 對象中列的類型和屬性信息的對象。下面的代碼是把一個表的列信息打印了出來。當然了,這只是一部分。詳細的參考JAVA JDK。

Java代碼
public static void main(String[] args) {   
        try {   
            Class.forName("com.mysql.jdbc.Driver").newInstance();   
            Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/ssi2bbs","root","");   
            PreparedStatement ps = conn.prepareStatement("select * from bbs");   
            ResultSet rs = ps.executeQuery();   
            ResultSetMetaData rsme = rs.getMetaData();   

            int columnCount = rsme.getColumnCount();   
            System.out.println("ResultSet對象中的列數"+ columnCount);   
            for (int i = 1; i < columnCount ; i++) {   
                System.out.println();   
                System.out.println("列名稱: "+ rsme.getColumnName(i));   
                System.out.println("列類型(DB): " + rsme.getColumnTypeName(i));   
                System.out.println("長度: "+ rsme.getPrecision(i) );   
                System.out.println("是否自動編號: "+ rsme.isAutoIncrement(i));   
                System.out.println("是否可以爲空: "+ rsme.isNullable(i));   
                System.out.println("是否可以寫入: "+ rsme.isReadOnly(i));   
            }   

        } catch (Exception e) {   
            e.printStackTrace();   
        }   

    }  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章