獲取數據庫的相關信息:
1.獲得數據庫的一些相關信息
2.獲得該用戶下面的所有表
3.獲得該用戶下面的所有視圖
4.獲得數據庫中所有方案名稱
5.獲得表或視圖中的所有列信息
6. 獲得一個表的索引信息
7.獲得一個表的主鍵信息
8.獲得一個表的外鍵信息
- package com.zsw.test;
- import java.sql.Connection;
- import java.sql.DatabaseMetaData;
- import java.sql.DriverManager;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- public class DatabaseMetaDateApplication {
- private DatabaseMetaData dbMetaData = null;
- private Connection con = null;
- public DatabaseMetaDateApplication() {
- this.getDatabaseMetaData();
- }
- private void getDatabaseMetaData() {
- try {
- if (dbMetaData == null) {
- Class.forName("com.mysql.jdbc.Driver");
- String url = "jdbc:mysql://localhost:3306/creation_cms";
- String user = "root";
- String password = "root";
- con = DriverManager.getConnection(url, user, password);
- dbMetaData = con.getMetaData();
- }
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- /**
- * 獲得數據庫的一些相關信息
- */
- public void getDataBaseInformations() {
- try {
- System.out.println("數據庫已知的用戶: "+ dbMetaData.getUserName());
- System.out.println("數據庫的系統函數的逗號分隔列表: "+ dbMetaData.getSystemFunctions());
- System.out.println("數據庫的時間和日期函數的逗號分隔列表: "+ dbMetaData.getTimeDateFunctions());
- System.out.println("數據庫的字符串函數的逗號分隔列表: "+ dbMetaData.getStringFunctions());
- System.out.println("數據庫供應商用於 'schema' 的首選術語: "+ dbMetaData.getSchemaTerm());
- System.out.println("數據庫URL: " + dbMetaData.getURL());
- System.out.println("是否允許只讀:" + dbMetaData.isReadOnly());
- System.out.println("數據庫的產品名稱:" + dbMetaData.getDatabaseProductName());
- System.out.println("數據庫的版本:" + dbMetaData.getDatabaseProductVersion());
- System.out.println("驅動程序的名稱:" + dbMetaData.getDriverName());
- System.out.println("驅動程序的版本:" + dbMetaData.getDriverVersion());
- System.out.println();
- System.out.println("數據庫中使用的表類型");
- ResultSet rs = dbMetaData.getTableTypes();
- while (rs.next()) {
- System.out.println(rs.getString(1));
- }
- rs.close();
- System.out.println();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- /**
- * 獲得該用戶下面的所有表
- */
- public void getAllTableList(String schemaName) {
- try {
- // table type. Typical types are "TABLE", "VIEW", "SYSTEM TABLE", "GLOBAL TEMPORARY", "LOCAL TEMPORARY", "ALIAS", "SYNONYM".
- String[] types = { "TABLE" };
- ResultSet rs = dbMetaData.getTables(null, schemaName, "%", 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();
- }
- }
- /**
- * 獲得該用戶下面的所有視圖
- */
- public void getAllViewList(String schemaName) {
- try{
- String[] types = { "VIEW" };
- ResultSet rs = dbMetaData.getTables(null, schemaName, "%", types);
- while (rs.next()){
- String viewName = rs.getString("TABLE_NAME"); //視圖名
- String viewType = rs.getString("TABLE_TYPE"); //視圖類型
- String remarks = rs.getString("REMARKS"); //視圖備注
- System.out.println(viewName + "-" + viewType + "-" + remarks);
- }
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- /**
- * 獲得數據庫中所有方案名稱
- */
- public void getAllSchemas(){
- try{
- ResultSet rs = dbMetaData.getSchemas();
- while (rs.next()){
- String tableSchem = rs.getString("TABLE_SCHEM");
- System.out.println(tableSchem);
- }
- } catch (SQLException e){
- e.printStackTrace();
- }
- }
- /**
- * 獲得表或視圖中的所有列信息
- */
- public void getTableColumns(String schemaName, String tableName) {
- try{
- ResultSet rs = dbMetaData.getColumns(null, schemaName, tableName, "%");
- while (rs.next()){
- String tableCat = rs.getString("TABLE_CAT");//表目錄(可能為空)
- String tableSchemaName = rs.getString("TABLE_SCHEM");//表的架構(可能為空)
- String tableName_ = rs.getString("TABLE_NAME");//表名
- String columnName = rs.getString("COLUMN_NAME");//列名
- int dataType = rs.getInt("DATA_TYPE"); //對應的java.sql.Types類型
- 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)
- int nullAble = rs.getInt("NULLABLE");//是否允許為null
- String remarks = rs.getString("REMARKS");//列描述
- String columnDef = rs.getString("COLUMN_DEF");//默認值
- int sqlDataType = rs.getInt("SQL_DATA_TYPE");//sql數據類型
- int sqlDatetimeSub = rs.getInt("SQL_DATETIME_SUB"); //SQL日期時間分?
- int charOctetLength = rs.getInt("CHAR_OCTET_LENGTH"); //char類型的列中的最大字節數
- int ordinalPosition = rs.getInt("ORDINAL_POSITION"); //表中列的索引(從1開始)
- /**
- * ISO規則用來確定某一列的為空性。
- * 是---如果該參數可以包括空值;
- * 無---如果參數不能包含空值
- * 空字符串---如果參數為空性是未知的
- */
- String isNullAble = rs.getString("IS_NULLABLE");
- /**
- * 指示此列是否是自動遞增
- * 是---如果該列是自動遞增
- * 無---如果不是自動遞增列
- * 空字串---如果不能確定它是否
- * 列是自動遞增的參數是未知
- */
- String isAutoincrement = rs.getString("IS_AUTOINCREMENT");
- System.out.println(tableCat + "-" + tableSchemaName + "-" + tableName_ + "-" + columnName + "-"
- + dataType + "-" + dataTypeName + "-" + columnSize + "-" + decimalDigits + "-" + numPrecRadix
- + "-" + nullAble + "-" + remarks + "-" + columnDef + "-" + sqlDataType + "-" + sqlDatetimeSub
- + charOctetLength + "-" + ordinalPosition + "-" + isNullAble + "-" + isAutoincrement + "-");
- }
- } catch (SQLException e){
- e.printStackTrace();
- }
- }
- /**
- * 獲得一個表的索引信息
- */
- public void getIndexInfo(String schemaName, String tableName) {
- try{
- ResultSet rs = dbMetaData.getIndexInfo(null, schemaName, tableName, true, true);
- while (rs.next()){
- boolean nonUnique = rs.getBoolean("NON_UNIQUE");//非唯一索引(Can index values be non-unique. false when TYPE is tableIndexStatistic )
- String indexQualifier = rs.getString("INDEX_QUALIFIER");//索引目錄(可能為空)
- String indexName = rs.getString("INDEX_NAME");//索引的名稱
- short type = rs.getShort("TYPE");//索引類型
- short ordinalPosition = rs.getShort("ORDINAL_POSITION");//在索引列順序號
- String columnName = rs.getString("COLUMN_NAME");//列名
- String ascOrDesc = rs.getString("ASC_OR_DESC");//列排序順序:升序還是降序
- int cardinality = rs.getInt("CARDINALITY"); //基數
- System.out.println(nonUnique + "-" + indexQualifier + "-" + indexName + "-" + type + "-" + ordinalPosition + "-" + columnName + "-" + ascOrDesc + "-" + cardinality);
- }
- } catch (SQLException e){
- e.printStackTrace();
- }
- }
- /**
- * 獲得一個表的主鍵信息
- */
- public void getAllPrimaryKeys(String schemaName, String tableName) {
- try{
- ResultSet rs = dbMetaData.getPrimaryKeys(null, schemaName, tableName);
- while (rs.next()){
- String columnName = rs.getString("COLUMN_NAME");//列名
- short keySeq = rs.getShort("KEY_SEQ");//序列號(主鍵內值1表示第一列的主鍵,值2代表主鍵內的第二列)
- String pkName = rs.getString("PK_NAME"); //主鍵名稱
- System.out.println(columnName + "-" + keySeq + "-" + pkName);
- }
- }catch (SQLException e){
- e.printStackTrace();
- }
- }
- /**
- * 獲得一個表的外鍵信息
- */
- public void getAllExportedKeys(String schemaName, String tableName) {
- try{
- ResultSet rs = dbMetaData.getExportedKeys(null, schemaName, tableName);
- while (rs.next()){
- String pkTableCat = rs.getString("PKTABLE_CAT");//主鍵表的目錄(可能為空)
- String pkTableSchem = rs.getString("PKTABLE_SCHEM");//主鍵表的架構(可能為空)
- String pkTableName = rs.getString("PKTABLE_NAME");//主鍵表名
- String pkColumnName = rs.getString("PKCOLUMN_NAME");//主鍵列名
- String fkTableCat = rs.getString("FKTABLE_CAT");//外鍵的表的目錄(可能為空)出口(可能為null)
- String fkTableSchem = rs.getString("FKTABLE_SCHEM");//外鍵表的架構(可能為空)出口(可能為空)
- String fkTableName = rs.getString("FKTABLE_NAME");//外鍵表名
- String fkColumnName = rs.getString("FKCOLUMN_NAME"); //外鍵列名
- short keySeq = rs.getShort("KEY_SEQ");//序列號(外鍵內值1表示第一列的外鍵,值2代表在第二列的外鍵)。
- /**
- * hat happens to foreign key when primary is updated:
- * importedNoAction - do not allow update of primary key if it has been imported
- * importedKeyCascade - change imported key to agree with primary key update
- * importedKeySetNull - change imported key to NULL if its primary key has been updated
- * importedKeySetDefault - change imported key to default values if its primary key has been updated
- * importedKeyRestrict - same as importedKeyNoAction (for ODBC 2.x compatibility)
- */
- short updateRule = rs.getShort("UPDATE_RULE");
- /**
- * What happens to the foreign key when primary is deleted.
- * importedKeyNoAction - do not allow delete of primary key if it has been imported
- * importedKeyCascade - delete rows that import a deleted key
- * importedKeySetNull - change imported key to NULL if its primary key has been deleted
- * importedKeyRestrict - same as importedKeyNoAction (for ODBC 2.x compatibility)
- * importedKeySetDefault - change imported key to default if its primary key has been deleted
- */
- short delRule = rs.getShort("DELETE_RULE");
- String fkName = rs.getString("FK_NAME");//外鍵的名稱(可能為空)
- String pkName = rs.getString("PK_NAME");//主鍵的名稱(可能為空)
- /**
- * can the evaluation of foreign key constraints be deferred until commit
- * importedKeyInitiallyDeferred - see SQL92 for definition
- * importedKeyInitiallyImmediate - see SQL92 for definition
- * importedKeyNotDeferrable - see SQL92 for definition
- */
- short deferRability = rs.getShort("DEFERRABILITY");
- System.out.println(pkTableCat + "-" + pkTableSchem + "-" + pkTableName + "-" + pkColumnName + "-"
- + fkTableCat + "-" + fkTableSchem + "-" + fkTableName + "-" + fkColumnName + "-" + keySeq + "-"
- + updateRule + "-" + delRule + "-" + fkName + "-" + pkName + "-" + deferRability);
- }
- } catch (SQLException e){
- e.printStackTrace();
- }
- }
- public void colseCon() {
- try {
- if (con != null) {
- con.close();
- }
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- public static void main(String[] args) {
- DatabaseMetaDateApplication metaData = new DatabaseMetaDateApplication();
- // metaData.getDataBaseInformations();
- // metaData.getAllTableList(null);
- // metaData.getAllViewList(null);
- // metaData.getAllSchemas();
- // metaData.getTableColumns(null, "zsc_admin");
- // metaData.getIndexInfo(null, "zsc_admin");
- // metaData.getAllPrimaryKeys(null, "zsc_admin");
- metaData.getAllExportedKeys(null, "zsc_admin");
- }
- }
