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