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次圍觀