JDBC操做元數據示例-- DatabaseMetaData接口

package com.util;
 
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
 
import oracle.jdbc.driver.OracleConnection;
 
/**
 * @Description: JDBC操做元數據示例-- DatabaseMetaData接口
 */
public class JdbcUtil {
    //得到驅動  
    private static String DRIVER = "oracle.jdbc.driver.OracleDriver";  
    //得到url  
    private static String URL = "jdbc:oracle:thin:@localhost:test";  
    //得到鏈接數據庫的用戶名  
    private static String USER = "root";  
    //得到鏈接數據庫的密碼  
    private static String PASS = "root";  
 
    static {  
        try {   
            //初始化JDBC驅動並讓驅動加載到jvm中  
            Class.forName(DRIVER);  
        } catch (ClassNotFoundException e) {  
            e.printStackTrace();  
        }  
    }  
    
    public static Connection getConnection(){  
        Connection conn = null;  
        try {   
            //鏈接數據庫  
            
           /*
            * 設置可獲取REMARK備註信息
           Properties props =new Properties();
           props.put("remarksReporting","true");
           props.put("user", USER);
           props.put("password", PASS);
           conn =DriverManager.getConnection(URL,props);*/
            
            conn = DriverManager.getConnection(URL,USER,PASS);  
            conn.setAutoCommit(true);
        } catch (SQLException e) {  
            e.printStackTrace();  
        }  
        return conn;  
    }  
 
    //關閉鏈接
    public static void close(Object o){  
        if (o == null){  
            return;  
        }  
        if (o instanceof ResultSet){  
            try {  
                ((ResultSet)o).close();  
            } catch (SQLException e) {  
                e.printStackTrace();  
            }  
        } else if(o instanceof Statement){  
            try {  
                ((Statement)o).close();  
            } catch (SQLException e) {  
                e.printStackTrace();  
            }  
        } else if (o instanceof Connection){  
            Connection c = (Connection)o;  
            try {  
                if (!c.isClosed()){  
                    c.close();  
                }  
            } catch (SQLException e) {  
                e.printStackTrace();  
            }  
        }    
    }  
    
    
    public static void close(ResultSet rs, Statement stmt,   
            Connection conn){  
        close(rs);  
        close(stmt);  
        close(conn);  
    }  
    
    public static void close(ResultSet rs,   
            Connection conn){  
        close(rs);   
        close(conn);  
    }  
    
    
    
    /**
     * @Description: 獲取數據庫相關信息
     */
    public static void getDataBaseInfo() {  
        Connection conn =  getConnection();
        ResultSet rs = null;
        try{  
             DatabaseMetaData dbmd = conn.getMetaData();
             System.out.println("數據庫已知的用戶: "+ dbmd.getUserName());    
             System.out.println("數據庫的系統函數的逗號分隔列表: "+ dbmd.getSystemFunctions());    
             System.out.println("數據庫的時間和日期函數的逗號分隔列表: "+ dbmd.getTimeDateFunctions());    
             System.out.println("數據庫的字符串函數的逗號分隔列表: "+ dbmd.getStringFunctions());    
             System.out.println("數據庫供應商用於 'schema' 的首選術語: "+ dbmd.getSchemaTerm());    
             System.out.println("數據庫URL: " + dbmd.getURL());    
             System.out.println("是否容許只讀:" + dbmd.isReadOnly());    
             System.out.println("數據庫的產品名稱:" + dbmd.getDatabaseProductName());    
             System.out.println("數據庫的版本:" + dbmd.getDatabaseProductVersion());    
             System.out.println("驅動程序的名稱:" + dbmd.getDriverName());    
             System.out.println("驅動程序的版本:" + dbmd.getDriverVersion());  
             
             System.out.println("數據庫中使用的表類型");    
             rs = dbmd.getTableTypes();    
             while (rs.next()) {    
                 System.out.println(rs.getString("TABLE_TYPE"));    
             }    
        }catch (SQLException e){  
            e.printStackTrace();  
        } finally{
            JdbcUtil.close(rs,conn);
        } 
    } 
    
    /**
     * @Description:得到數據庫中全部Schemas(對應於oracle中的Tablespace)
     */
    public static void getSchemasInfo(){  
        Connection conn =  getConnection();
        ResultSet rs = null;
        try{  
            DatabaseMetaData dbmd = conn.getMetaData();
            rs = dbmd.getSchemas();   
            while (rs.next()){     
                String tableSchem = rs.getString("TABLE_SCHEM"); 
                System.out.println(tableSchem);     
            }     
        } catch (SQLException e){  
            e.printStackTrace();     
        } finally{
            JdbcUtil.close(rs,conn);
        }  
    }  
    
    /**
     * @Description: 獲取數據庫中全部的表信息
     */
    public static void getTablesList() {  
        Connection conn =  getConnection();
        ResultSet rs = null;
        try {  
            /**
             * 設置鏈接屬性,使得可獲取到表的REMARK(備註)
             */
            ((OracleConnection)conn).setRemarksReporting(true); 
            DatabaseMetaData dbmd = conn.getMetaData();
            String[] types = { "TABLE" };  
            rs = dbmd.getTables(null, null, "%", types);  
            while (rs.next()) {  
                String tableName = rs.getString("TABLE_NAME");  //表名  
                String tableType = rs.getString("TABLE_TYPE");  //表類型  
                String remarks = rs.getString("REMARKS");       //表備註  
                System.out.println(tableName + " - " + tableType + " - " + remarks);  
            }  
        } catch (SQLException e) {  
            e.printStackTrace();  
        } finally{
            JdbcUtil.close(rs,conn);
        } 
    }  
    
    /**
     * @Description: 獲取某表信息
     */
    public static void getTablesInfo(){
        Connection conn =  getConnection();
        ResultSet rs = null;
        try {
            /**
             * 設置鏈接屬性,使得可獲取到表的REMARK(備註)
             */
            ((OracleConnection)conn).setRemarksReporting(true); 
            DatabaseMetaData dbmd = conn.getMetaData();
            /**
             * 獲取給定類別中使用的表的描述。
             * 方法原型:ResultSet getTables(String catalog,String schemaPattern,String tableNamePattern,String[] types);
             * catalog - 表所在的類別名稱;""表示獲取沒有類別的列,null表示獲取全部類別的列。
             * schema - 表所在的模式名稱(oracle中對應於Tablespace);""表示獲取沒有模式的列,null標識獲取全部模式的列; 可包含單字符通配符("_"),或多字符通配符("%");
             * tableNamePattern - 表名稱;可包含單字符通配符("_"),或多字符通配符("%");
             * types - 表類型數組; "TABLE"、"VIEW"、"SYSTEM TABLE"、"GLOBAL TEMPORARY"、"LOCAL TEMPORARY"、"ALIAS" 和 "SYNONYM";null表示包含全部的表類型;可包含單字符通配符("_"),或多字符通配符("%"); 
             */
            rs = dbmd.getTables(null, null, "CUST_INTER_TF_SERVICE_REQ", new String[]{"TABLE","VIEW"}); 
 
 
            while(rs.next()){
                 String tableCat = rs.getString("TABLE_CAT");  //表類別(可爲null) 
                 String tableSchemaName = rs.getString("TABLE_SCHEM");//表模式(可能爲空),在oracle中獲取的是命名空間,其它數據庫未知     
                 String tableName = rs.getString("TABLE_NAME");  //表名  
                 String tableType = rs.getString("TABLE_TYPE");  //表類型,典型的類型是 "TABLE"、"VIEW"、"SYSTEM TABLE"、"GLOBAL TEMPORARY"、"LOCAL TEMPORARY"、"ALIAS" 和 "SYNONYM"。
                 String remarks = rs.getString("REMARKS");       //表備註  
                 
                 System.out.println(tableCat + " - " + tableSchemaName + " - " +tableName + " - " + tableType + " - " 
                        + remarks);  
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }finally{
            JdbcUtil.close(rs,conn);
        }
    }
 
    /**
     * @Description: 獲取表主鍵信息
     */
    public static void getPrimaryKeysInfo() {  
        Connection conn =  getConnection();
        ResultSet rs = null;
        try{  
            DatabaseMetaData dbmd = conn.getMetaData();
            /**
             * 獲取對給定表的主鍵列的描述
             * 方法原型:ResultSet getPrimaryKeys(String catalog,String schema,String table);
             * catalog - 表所在的類別名稱;""表示獲取沒有類別的列,null表示獲取全部類別的列。
             * schema - 表所在的模式名稱(oracle中對應於Tablespace);""表示獲取沒有模式的列,null標識獲取全部模式的列; 可包含單字符通配符("_"),或多字符通配符("%");
             * table - 表名稱;可包含單字符通配符("_"),或多字符通配符("%");
             */
            rs = dbmd.getPrimaryKeys(null, null, "CUST_INTER_TF_SERVICE_REQ");  
            
            while (rs.next()){  
                String tableCat = rs.getString("TABLE_CAT");  //表類別(可爲null) 
                String tableSchemaName = rs.getString("TABLE_SCHEM");//表模式(可能爲空),在oracle中獲取的是命名空間,其它數據庫未知     
                String tableName = rs.getString("TABLE_NAME");  //表名  
                String columnName = rs.getString("COLUMN_NAME");//列名  
                short keySeq = rs.getShort("KEY_SEQ");//序列號(主鍵內值1表示第一列的主鍵,值2表明主鍵內的第二列)  
                String pkName = rs.getString("PK_NAME"); //主鍵名稱    
                
                System.out.println(tableCat + " - " + tableSchemaName + " - " + tableName + " - " + columnName + " - "
                       + keySeq + " - " + pkName);     
            }  
        }catch (SQLException e){  
            e.printStackTrace();  
        }finally{
            JdbcUtil.close(rs,conn);
        }
    }  
    
    /**
     * @Description: 獲取表索引信息
     */
    public static void getIndexInfo() { 
        Connection conn =  getConnection();
        ResultSet rs = null;
        try{  
            DatabaseMetaData dbmd = conn.getMetaData();
            /**
             * 獲取給定表的索引和統計信息的描述
             * 方法原型:ResultSet getIndexInfo(String catalog,String schema,String table,boolean unique,boolean approximate)
             * catalog - 表所在的類別名稱;""表示獲取沒有類別的列,null表示獲取全部類別的列。
             * schema - 表所在的模式名稱(oracle中對應於Tablespace);""表示獲取沒有模式的列,null標識獲取全部模式的列; 可包含單字符通配符("_"),或多字符通配符("%");
             * table - 表名稱;可包含單字符通配符("_"),或多字符通配符("%");
             * unique - 該參數爲 true時,僅返回惟一值的索引; 該參數爲 false時,返回全部索引;
             * approximate - 該參數爲true時,容許結果是接近的數據值或這些數據值之外的值;該參數爲 false時,要求結果是精確結果;
             */
            rs = dbmd.getIndexInfo(null, null, "CUST_INTER_TF_SERVICE_REQ", false, true);  
            while (rs.next()){  
                String tableCat = rs.getString("TABLE_CAT");  //表類別(可爲null) 
                String tableSchemaName = rs.getString("TABLE_SCHEM");//表模式(可能爲空),在oracle中獲取的是命名空間,其它數據庫未知     
                String tableName = rs.getString("TABLE_NAME");  //表名  
                boolean nonUnique = rs.getBoolean("NON_UNIQUE");// 索引值是否能夠不惟一,TYPE爲 tableIndexStatistic時索引值爲 false;
                String indexQualifier = rs.getString("INDEX_QUALIFIER");//索引類別(可能爲空),TYPE爲 tableIndexStatistic 時索引類別爲 null; 
                String indexName = rs.getString("INDEX_NAME");//索引的名稱 ;TYPE爲 tableIndexStatistic 時索引名稱爲 null;
                /**
                 * 索引類型: 
                 *  tableIndexStatistic - 此標識與表的索引描述一塊兒返回的表統計信息 
                 *  tableIndexClustered - 此爲集羣索引 
                 *  tableIndexHashed - 此爲散列索引 
                 *  tableIndexOther - 此爲某種其餘樣式的索引 
                 */
                short type = rs.getShort("TYPE");//索引類型;
                short ordinalPosition = rs.getShort("ORDINAL_POSITION");//在索引列順序號;TYPE爲 tableIndexStatistic 時該序列號爲零;
                String columnName = rs.getString("COLUMN_NAME");//列名;TYPE爲 tableIndexStatistic時列名稱爲 null;
                String ascOrDesc = rs.getString("ASC_OR_DESC");//列排序順序:升序仍是降序[A:升序; B:降序];若是排序序列不受支持,可能爲 null;TYPE爲 tableIndexStatistic時排序序列爲 null;
                int cardinality = rs.getInt("CARDINALITY");   //基數;TYPE爲 tableIndexStatistic 時,它是表中的行數;不然,它是索引中惟一值的數量。   
                int pages = rs.getInt("PAGES"); //TYPE爲 tableIndexStatisic時,它是用於表的頁數,不然它是用於當前索引的頁數。
                String filterCondition = rs.getString("FILTER_CONDITION"); //過濾器條件,若是有的話(可能爲 null)。
                
                System.out.println(tableCat + " - " + tableSchemaName + " - " + tableName + " - " + nonUnique + " - " 
                       + indexQualifier + " - " + indexName + " - " + type + " - " + ordinalPosition + " - " + columnName 
                       + " - " + ascOrDesc + " - " + cardinality + " - " + pages + " - " + filterCondition);     
            }     
        } catch (SQLException e){  
            e.printStackTrace();     
        } finally{
            JdbcUtil.close(rs,conn);
        }  
    }  
    
     
    /**
     * @Description: 獲取表中列值信息
     */
    public static void getColumnsInfo(){
        Connection conn =  getConnection();
        ResultSet rs = null;
        
        try{
            /**
             * 設置鏈接屬性,使得可獲取到列的REMARK(備註)
             */
            ((OracleConnection)conn).setRemarksReporting(true); 
            DatabaseMetaData dbmd = conn.getMetaData();
            /**
             * 獲取可在指定類別中使用的表列的描述。
             * 方法原型:ResultSet getColumns(String catalog,String schemaPattern,String tableNamePattern,String columnNamePattern)
             * catalog - 表所在的類別名稱;""表示獲取沒有類別的列,null表示獲取全部類別的列。
             * schema - 表所在的模式名稱(oracle中對應於Tablespace);""表示獲取沒有模式的列,null標識獲取全部模式的列; 可包含單字符通配符("_"),或多字符通配符("%");
             * tableNamePattern - 表名稱;可包含單字符通配符("_"),或多字符通配符("%");
             * columnNamePattern - 列名稱; ""表示獲取列名爲""的列(固然獲取不到);null表示獲取全部的列;可包含單字符通配符("_"),或多字符通配符("%");
             */
            rs =dbmd.getColumns(null, null, "CUST_INTER_TF_SERVICE_REQ", null);
            
            while(rs.next()){
                String tableCat = rs.getString("TABLE_CAT");  //表類別(可能爲空)                  
                String tableSchemaName = rs.getString("TABLE_SCHEM");  //表模式(可能爲空),在oracle中獲取的是命名空間,其它數據庫未知     
                String tableName_ = rs.getString("TABLE_NAME");  //表名  
                String columnName = rs.getString("COLUMN_NAME");  //列名  
                int dataType = rs.getInt("DATA_TYPE");     //對應的java.sql.Types的SQL類型(列類型ID)     
                String dataTypeName = rs.getString("TYPE_NAME");  //java.sql.Types類型名稱(列類型名稱)
                int columnSize = rs.getInt("COLUMN_SIZE");  //列大小  
                int decimalDigits = rs.getInt("DECIMAL_DIGITS");  //小數位數 
                int numPrecRadix = rs.getInt("NUM_PREC_RADIX");  //基數(一般是10或2) --未知
                /**
                 *  0 (columnNoNulls) - 該列不容許爲空
                 *  1 (columnNullable) - 該列容許爲空
                 *  2 (columnNullableUnknown) - 不肯定該列是否爲空
                 */
                int nullAble = rs.getInt("NULLABLE");  //是否容許爲null  
                String remarks = rs.getString("REMARKS");  //列描述  
                String columnDef = rs.getString("COLUMN_DEF");  //默認值  
                int charOctetLength = rs.getInt("CHAR_OCTET_LENGTH");    // 對於 char 類型,該長度是列中的最大字節數 
                int ordinalPosition = rs.getInt("ORDINAL_POSITION");   //表中列的索引(從1開始)  
                /** 
                 * ISO規則用來肯定某一列的是否可爲空(等同於NULLABLE的值:[ 0:'YES'; 1:'NO'; 2:''; ])
                 * YES -- 該列能夠有空值; 
                 * NO -- 該列不能爲空;
                 * 空字符串--- 不知道該列是否可爲空
                 */  
                String isNullAble = rs.getString("IS_NULLABLE");  
                  
                /** 
                 * 指示此列是不是自動遞增 
                 * YES -- 該列是自動遞增的
                 * NO -- 該列不是自動遞增
                 * 空字串--- 不能肯定該列是否自動遞增
                 */  
                //String isAutoincrement = rs.getString("IS_AUTOINCREMENT");   //該參數測試報錯    
                
                
                System.out.println(tableCat + " - " + tableSchemaName + " - " + tableName_ + " - " + columnName + 
                        " - " + dataType + " - " + dataTypeName + " - " + columnSize + " - " + decimalDigits + " - " 
                        + numPrecRadix + " - " + nullAble + " - " + remarks + " - " + columnDef + " - " + charOctetLength
                        + " - " + ordinalPosition + " - " + isNullAble ); 
                
            }
        }catch(SQLException ex){
            ex.printStackTrace();
        }finally{
            JdbcUtil.close(rs,conn);
        }
    }
    
    /**
     * @Description: TODO
     */
    public static void main(String[] args) {
        getDataBaseInfo();  //獲取數據庫信息
        getSchemasInfo(); //獲取數據庫全部Schema
        getTablesList();  //獲取某用戶下全部的表
        getTablesInfo();  //獲取表信息
        getPrimaryKeysInfo(); //獲取表主鍵信息
        getIndexInfo();  //獲取表索引信息
        getColumnsInfo(); //獲取表中列值信息
    }
}
 java

相關文章
相關標籤/搜索