JDBC查询数据库表信息

得到这个对象的实例

Connection con ;
con = DriverManager.getConnection(url,userName,password);
DatabaseMetaData dbmd = con.getMetaData();

获取DataBaseMetadata对象

我们需用使用Connection对象的getMetaData方法来获取DataBaseMeta对象,如下示例代码,我们演示获取DataBaseMetadata对象,并从DataBaseMetadata对象中获取数据库信息。

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 {
        close(rs, conn);
    }
}

获取数据表

  • 原型: ResultSet DatabaseMetaData.getTables(String catalog,String schemaPattern,String tableNamePattern,String[] types) 功能描述:得到指定参数的表信息 参数说明: 参数catalog: 目录名称,一般都为空,在MySQL中代表数据库名称 参数schemaPattern: 数据库名称模式匹配,null表示不缩小搜索范围数据库名,对于oracle来说就用户名 参数tableNamePattern: 表名称模式匹配字符, 参数types: 表类型列表,包含值(TABLE | VIEW),null返回所有类型

来看下面的演示示例:

//获取test数据库下面所有表信息
public static void getTablesList() {
    Connection conn = getConnection();
    ResultSet rs = null;
    try {
        DatabaseMetaData dbmd = conn.getMetaData();
        String[] types = {"TABLE"};
        rs = dbmd.getTables("test", 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);
    }
}

获取字段

  • 功能描述:得到指定表的列信息。 原型: ResultSet DatabaseMetaData getColumns(String catalog,String schemaPattern,String tableNamePattern,String columnNamePattern)

参数说明: 参数catalog: 目录名称,一般都为空,在MySQL中代表数据库名称 参数schemaPattern: 数据库名称模式匹配,null表示不缩小搜索范围数据库名,对于oracle来说就用户名 参数tableNamePattern: 表名称模式匹配字符 参数columnNamePattern: 列名模式匹配字符

下面来看一个演示示例

//获取test数据库中所有表id列信息
public static void getColumnsInfo() {
    Connection conn = getConnection();
    ResultSet rs = null;
    try {
        DatabaseMetaData dbmd = conn.getMetaData();
        rs = dbmd.getColumns("test", null, null, "id");
        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");
            System.out.println(tableCat + " - " + tableSchemaName + " - " + tableName_ + " - " + columnName + " - " + dataType + " - " + dataTypeName + " - " + columnSize + " - " + decimalDigits + " - " + numPrecRadix + " - " + nullAble + " - " + remarks + " - " + columnDef + " - " + charOctetLength + " - " + ordinalPosition + " - " + isNullAble);
        }
    } catch (SQLException ex) {
        ex.printStackTrace();
    } finally {
        close(rs, conn);
    }
}

获取主键

  • 功能描述:得到指定表的主键信息。 原型: ResultSet DatabaseMetaData getPrimaryKeys(String catalog,String schema,String table) 参数说明: 参数catalog : 目录名称,一般都为空,在MySQL中代表数据库名称 参数schema : 模式名称 参数table : 数据库表名称 备注:一定要指定表名称,否则返回值将是什么都没有。

下面来看一个示例

//获取表主键信息
public static void getPrimaryKeysInfo() {
    Connection conn = getConnection();
    ResultSet rs = null;
    try {
        DatabaseMetaData dbmd = conn.getMetaData();
        rs = dbmd.getPrimaryKeys(null, null, "account");
        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 {
        close(rs, conn);
    }
}

获取索引

  • 功能描述:获取给定表的索引和统计信息的描述 原型: ResultSet getIndexInfo(String catalog,String schema,String table,boolean unique,boolean approximate) 参数说明: 参数catalog: 目录名称,一般都为空,在MySQL中代表数据库名称 参数schema: 模式名称 参数table: 数据库表名称 参数unique: 该参数为true时,仅返回唯一值的索引; 该参数为false时,返回所有索引 参数approximate:该参数为true时,允许结果是接近的数据值或这些数据值以外的值;该参数为 false时,要求结果是精确结果;

下面来演示一个示例

//获取表索引信息
public static void getIndexInfo() {
    Connection conn = getConnection();
    ResultSet rs = null;
    try {
        DatabaseMetaData dbmd = conn.getMetaData();
        rs = dbmd.getIndexInfo(null, null, "account", 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 {
        close(rs, conn);
    }
}

注意: 1. JDBC元数据的操作是很消耗性能的,所以应尽量避免使用。 2. 在获取元数据中的REMARK(备注)前,需要设置在连接字符串中加入useInformationSchema=true。 3. 上述代码在MYSQL验证通过