Java获取mysql数据库元数据

修改后的版本:

package com.genratesql.util;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

import com.genratesql.pojo.Field;

public class DatabaseMetaUtil {
	
	private final static String DATABASE_NAME = "generatesql";
	
	private DatabaseMetaData dbMetaData = null;
	private Connection con = null;

	public DatabaseMetaUtil() {
		this.getDatabaseMetaData();
	}
	
	private void getDatabaseMetaData() {
		try {
			if (dbMetaData == null) {
				Class.forName("com.mysql.jdbc.Driver");
				String url = "jdbc:mysql://localhost:3306/" + DATABASE_NAME;
				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();
		}
	}

	/**
	 * 根据指定用户名与表名获取其中列字段名
	 * 
	 * @param schemaName
	 * @param tableName
	 * @return
	 */
	public Map<String, Field> getColumnNameBySchemaNameAndTableName(String schemaName, String tableName) {
		Map<String, Field> columns = null;
		try {
			columns = new HashMap<>();
			ResultSet rs = dbMetaData.getColumns(null, schemaName, tableName, "%");
			while (rs.next()) {
				String columnName = rs.getString("COLUMN_NAME");// 列名
				String dataTypeName = rs.getString("TYPE_NAME");// java.sql.Types类型名称
				int columnSize = rs.getInt("COLUMN_SIZE");// 列大小
				Field field = new Field(columnName, dataTypeName, columnSize);
				columns.put(columnName, field);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return columns;
	}
	
	/**
	 * 获得一个表的主键信息
	 */
	public String getPrimaryKeyBySchemaNameAndTableName(String schemaName, String tableName) {
		String primaryKey = null;
		try {
			ResultSet rs = dbMetaData.getPrimaryKeys(null, schemaName, tableName);
			while (rs.next()) {
				primaryKey = rs.getString("COLUMN_NAME");
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return primaryKey;
	}


	/**
	 * 获得表或视图中的所有列信息
	 */
	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) {
		DatabaseMetaUtil metaData = new DatabaseMetaUtil();
		// metaData.getDataBaseInformations();
		// metaData.getAllTableList(null);
		// metaData.getAllViewList(null);
		// metaData.getAllSchemas();
		// metaData.getTableColumns("root", "gen_person");
		// System.out.println("=======================");
		// metaData.getIndexInfo("root", "gen_person");
		// System.out.println("=======================");
		metaData.getAllPrimaryKeys("root", "gen_person");
		// System.out.println("=======================");
		// metaData.getAllExportedKeys("root", "gen_person");
		// System.out.println("=======================");
		// Map<String, Field> columnNameBySchemaNameAndTableName =
		// metaData.getColumnNameBySchemaNameAndTableName("root", "gen_person");
		// Set<Entry<String, Field>> entrySet =
		// columnNameBySchemaNameAndTableName.entrySet();
		// for (Entry<String, Field> entry : entrySet) {
		// System.out.println("key:" + entry.getKey());
		// System.out.println("value:" + entry.getValue().toString());
		// }
	}

}

  

新版本使用到的Field类:

package com.genratesql.pojo;

public class Field {
	private String fieldName;
	private String fieldType;
	private Integer fieldLength;

	public Field() {
	}

	public Field(String fieldName, String fieldType, Integer fieldLength) {
		this.fieldName = fieldName;
		this.fieldType = fieldType;
		this.fieldLength = fieldLength;
	}

	public String getFieldName() {
		return fieldName;
	}

	public void setFieldName(String fieldName) {
		this.fieldName = fieldName;
	}

	public String getFieldType() {
		return fieldType;
	}

	public void setFieldType(String fieldType) {
		this.fieldType = fieldType;
	}

	public Integer getFieldLength() {
		return fieldLength;
	}

	public void setFieldLength(Integer fieldLength) {
		this.fieldLength = fieldLength;
	}

	@Override
	public String toString() {
		return "Field [fieldName=" + fieldName + ", fieldType=" + fieldType + ", fieldLength=" + fieldLength + "]";
	}

}

  

====

原始版本:

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");
		
		
	}


}