歡迎您光臨本站 註冊首頁

Java獲取DB元數據

←手機掃碼閱讀     火星人 @ 2014-03-09 , reply:0

package com.util.jdbc;

import java.sql.Connection;

import java.sql.Driver;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.ResultSetMetaData;

import java.sql.SQLException;

import java.util.Enumeration;

import org.apache.log4j.Logger;

/**

* @author ken

* @Time 2011-12-10

* SQL API 學習

*/

public class JDBCMsg {

private static Logger log = Logger.getLogger(JDBCMsg.class);

public static void main(String[] args) throws SQLException {

//rs connection 未關閉

//getAllDriverMsg();

//getDBParameterMetaData();

demoDB();

}

/**

* 取一個資料庫中所有表的信息

* @throws SQLException

*/

public static void demoDB() throws SQLException{

Connection conn = JDBCUtil.getConnection();

log.info("###### DatabaseMetaData關於資料庫的整體綜合信息====");

java.sql.DatabaseMetaData dbmd = conn.getMetaData();

log.info("資料庫產品名: " dbmd.getDatabaseProductName());

log.info("資料庫是否支持事務: " dbmd.supportsTransactions());

log.info("資料庫產品的版本號:" dbmd.getDatabaseProductVersion());

log.info("資料庫的默認事務隔離級別:" dbmd.getDefaultTransactionIsolation());

log.info("支持批量更新:" dbmd.supportsBatchUpdates());

log.info("DBMS 的 URL:" dbmd.getURL());

log.info("資料庫的已知的用戶名稱:" dbmd.getUserName());

log.info("資料庫是否處於只讀模式:" dbmd.isReadOnly());

log.info("資料庫是否支持為列提供別名:" dbmd.supportsColumnAliasing());

log.info("是否支持指定 LIKE 轉義子句:" dbmd.supportsLikeEscapeClause());

log.info("是否為外連接提供受限制的支持:" dbmd.supportsLimitedOuterJoins());

log.info("是否允許一次打開多個事務:" dbmd.supportsMultipleTransactions());

log.info("是否支持 EXISTS 表達式中的子查詢:" dbmd.supportsSubqueriesInExists());

log.info("是否支持 IN 表達式中的子查詢:" dbmd.supportsSubqueriesInIns());

log.info("是否支持給定事務隔離級別:" dbmd.supportsTransactionIsolationLevel(1));

log.info("此資料庫是否支持事務:" dbmd.supportsTransactions());

log.info("此資料庫是否支持 SQL UNION:" dbmd.supportsUnion());

log.info("此資料庫是否支持 SQL UNION ALL:" dbmd.supportsUnionAll());

log.info("此資料庫是否為每個表使用一個文件:" dbmd.usesLocalFilePerTable());

log.info("此資料庫是否將表存儲在本地文件中:" dbmd.usesLocalFiles());

log.info("底層資料庫的主版本號:" dbmd.getDatabaseMajorVersion());

log.info("底層資料庫的次版本號:" dbmd.getDatabaseMinorVersion());

log.info("JDBC 驅動程序的主版本號:" dbmd.getJDBCMajorVersion());

log.info("JDBC 驅動程序的次版本號:" dbmd.getJDBCMinorVersion());

log.info("JDBC 驅動程序的名稱:" dbmd.getDriverName());

log.info("JDBC 驅動程序的 String 形式的版本號:" dbmd.getDriverVersion());

log.info("可以在不帶引號的標識符名稱中使用的所有「額外」字元:" dbmd.getExtraNameCharacters());

log.info("用於引用 SQL 標識符的字元串:" dbmd.getIdentifierQuoteString());

log.info("允許用於類別名稱的最大字元數:" dbmd.getMaxCatalogNameLength());

log.info("允許用於列名稱的最大字元數:" dbmd.getMaxColumnNameLength());

log.info("允許在 GROUP BY 子句中使用的最大列數:" dbmd.getMaxColumnsInGroupBy());

log.info("允許在 SELECT 列表中使用的最大列數:" dbmd.getMaxColumnsInSelect());

log.info("允許在表中使用的最大列數:" dbmd.getMaxColumnsInTable());

log.info("資料庫的併發連接的可能最大數:" dbmd.getMaxConnections());

log.info("允許用於游標名稱的最大字元數:" dbmd.getMaxCursorNameLength());

log.info("在同一時間內可處於開放狀態的最大活動語句數:" dbmd.getMaxStatements());

//獲取所有表 new String[]{"TABLE"}

//String[] type = {"TABLE","VIEW"} null

log.info("###### 獲取表的信息");

ResultSet tSet = dbmd.getTables(null, "%", "%", new String[]{"TABLE","VIEW"});

while (tSet.next()) {

log.info(tSet.getRow() "_表類別:" tSet.getString("TABLE_CAT") "_表模式:" tSet.getString("TABLE_SCHEM")

"_表名稱:" tSet.getString("TABLE_NAME") "_表類型:" tSet.getString("TABLE_TYPE")

// "\n_表的解釋性註釋:" tSet.getString("REMARKS") "_類型的類別:" tSet.getString("TYPE_CAT")

// "\n_類型模式:" tSet.getString("TYPE_SCHEM") "_類型名稱:" tSet.getString("TYPE_NAME")

// "\n_有類型表的指定'identifier'列的名稱:" tSet.getString("SELF_REFERENCING_COL_NAME")

// "\n_指定在 SELF_REFERENCING_COL_NAME 中創建值的方式:" tSet.getString("REF_GENERATION")

);

//2_表類別:MANOR_表模式:PUBLIC_表名稱:SYS_RESOURCE_表類型:TABLE

String tableName = tSet.getString(3);

String sql = "select * from " tableName;

ResultSet rsSet = conn.createStatement().executeQuery(sql);

ResultSetMetaData rsData = rsSet.getMetaData();

for (int i = 1; i <= rsData.getColumnCount(); i ) {

log.info("==列的信息:獲取SQL語句的列名:" rsData.getColumnName(i) "(" rsData.getColumnLabel(i) "," rsData.getColumnType(i) "," rsData.getColumnClassName(i) ")"

" 列寬" rsData.getPrecision(i) " 大小寫敏感" rsData.isCaseSensitive(i) " isReadOnly:" rsData.isReadOnly(i));

//==列的信息:獲取SQL語句的列名:LIMITLEVER(LIMITLEVER,5,java.lang.Short) 列寬5 大小寫敏感true isReadOnly:false

}

}

tSet.close();

log.info("###### 獲取當前資料庫所支持的SQL數據類型");

ResultSet tableType = dbmd.getTypeInfo();

while(tableType.next()){

log.info("數據類型名:" tableType.getString(1)

",短整型的數:" tableType.getString(2)

",整型的數:" tableType.getString(3)

",最小精度:" tableType.getString(14)

",最大精度:" tableType.getString(15));

//數據類型名:TIMESTAMP,短整型的數:93,整型的數:23,最小精度:0,最大精度:10

//數據類型名:VARCHAR,短整型的數:12,整型的數:2147483647,最小精度:0,最大精度:0

}

log.info("###### 表的主鍵列信息");

ResultSet primaryKey = dbmd.getPrimaryKeys("MANOR","PUBLIC","SYS_ROLE_RES");

while(primaryKey.next()){

log.info("表名:" primaryKey.getString("TABLE_NAME") ",列名:" primaryKey.getString("COLUMN_NAME")

" 主鍵名:" primaryKey.getString("PK_NAME"));

//表名:SYS_ROLE_RES,列名:SYS_RES_ID 主鍵名:CONSTRAINT_9

//表名:SYS_ROLE_RES,列名:SYS_ROLE_ID 主鍵名:CONSTRAINT_9

}

log.info("###### 表的外鍵列信息");

ResultSet foreinKey = dbmd.getImportedKeys("MANOR","PUBLIC","SYS_ROLE_RES");

while(foreinKey.next()){

log.info("主鍵名:" foreinKey.getString("PK_NAME") ",外鍵名:" foreinKey.getString("FKCOLUMN_NAME")

",主鍵表名:" foreinKey.getString("PKTABLE_NAME") ",外鍵表名:" foreinKey.getString("FKTABLE_NAME")

",外鍵列名:" foreinKey.getString("PKCOLUMN_NAME") ",外鍵序號:" foreinKey.getString("KEY_SEQ"));

//主鍵名:PRIMARY_KEY_95,外鍵名:SYS_RES_ID,主鍵表名:SYS_RESOURCE,外鍵表名:SYS_ROLE_RES,外鍵列名:ID,外鍵序號:1

//主鍵名:PRIMARY_KEY_A,外鍵名:SYS_ROLE_ID,主鍵表名:SYS_ROLE,外鍵表名:SYS_ROLE_RES,外鍵列名:ID,外鍵序號:1

}

log.info("###### 獲取資料庫中允許存在的表類型");

ResultSet tableTypes = dbmd.getTableTypes();

while(tableTypes.next()){

log.info("類型名:" tableTypes.getString(1));

/** H2

類型名:SYSTEM TABLE

類型名:TABLE

類型名:TABLE LINK

類型名:VIEW

*/

}

//此外還可以獲取索引等的信息

conn.close();

}

/**

* PreparedStatement 信息

* ResultSetMetaData 信息

* @throws SQLException

*/

public static void getDBParameterMetaData() throws SQLException{

Connection conn = JDBCUtil.getConnection(); //id,name

PreparedStatement pre = conn.prepareStatement("SELECT * FROM SYS_APPTYPE where id = ?");

pre.setInt(1, 3);

java.sql.ParameterMetaData pmd = pre.getParameterMetaData();

log.info("參數的個數:" pmd.getParameterCount());

log.info("獲取指定參數的 SQL 類型:" pmd.getParameterType(1));

log.info("culomn的參數類型:" pmd.getParameterTypeName(1));

log.info("Java 類的完全限定名稱:" pmd.getParameterClassName(1));

log.info("獲取指定參數的模式:" pmd.getParameterMode(1));

log.info("獲取指定參數的指定列大小:" pmd.getPrecision(1));

log.info("獲取指定參數的小數點右邊的位數:" pmd.getScale(1));

log.info("是否允許在指定參數中使用 null 值:" pmd.isNullable(1));

log.info("指定參數的值是否可以是帶符號的數字:" pmd.isSigned(1));

//獲取結果集元數據

ResultSet rs = pre.executeQuery();

while (rs.next()) {

log.info(rs.getString(1) "___" rs.getString(2));

}

rs.close();

}

/**

* 獲取所有Driver信息

*/

public static void getAllDriverMsg(){

Enumeration<Driver> drivers = DriverManager.getDrivers();

while(drivers.hasMoreElements()) {

Driver d = drivers.nextElement();

log.info(d.getClass().getName() "_" d.getMajorVersion());

}

}

}


[火星人 ] Java獲取DB元數據已經有368次圍觀

http://coctec.com/docs/java/show-post-59904.html