DatabaseMetaData的使用

发布于 2019-03-01  21 次阅读


DatabaseMetaDate可以获取数据库的表名,字段名等信息。

今天在写项目时用到了DatabaseMetaData,网上找了好多资料才会使用。在此记录下几个主要用法。

获取数据表

ResultSet resultSet = metaData.getTables(null, null, null, new String[]{"TABLE"});
//获取表名
resultSet.getString("TABLE_NAME")

获取主键

ResultSet pkRs = metaData.getPrimaryKeys(dbName, null, tableName);
//获取主键名
pkRs.getObject(4)

这个函数的参数要注意下,对于mysql,第一个参数catalog才是数据库名,第二个参数schema并非数据库名,填写null即可(当时这边参数没写对,调了好久才发现)

获取字段信息

ResultSet resultSet = metaData.getColumns(null, "%", tableName, "%");
//字段名
resultSet.getString("COLUMN_NAME")
//字段类型
resultSet.getString("TYPE_NAME")
//备注
resultSet.getString("REMARKS")

样例代码

从项目中摘取了段代码

private static Connection getConnection() throws Exception {
        if (connection == null) {
            try {
                connection = DriverManager.getConnection("jdbc:mysql://" + dbUrl + "/" + dbName + "?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai", dbUsername, dbPassword);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return connection;
    }

下面代码中的Table和Column为项目中用到的类,忽略就行

    /**
     * 获取所有表名
     *
     * @return
     * @throws Exception
     */
    public static List<Table> getTableNames() throws Exception {
        List<Table> tableNames = new ArrayList<Table>();
        DatabaseMetaData metaData = getConnection().getMetaData();
        ResultSet resultSet = metaData.getTables(null, null, null, new String[]{"TABLE"});
        while (resultSet.next()) {
            Table table = new Table();
            table.setTableName(resultSet.getString("TABLE_NAME"));
            table.setFormattedTableName(replaceUnderLineAndUpperCase(table.getTableName()));
            tableNames.add(table);
        }
        return tableNames;
    }

    /**
     * 获取所有字段信息
     *
     * @param tableName 表名
     * @throws Exception
     */
    public static List<Column> getColumns(String tableName) throws Exception {
        DatabaseMetaData metaData = getConnection().getMetaData();
        ResultSet pkRs = metaData.getPrimaryKeys(dbName, null, tableName);
        List<String> pk = new ArrayList<String>();
        while (pkRs.next()) {
            pk.add((String) pkRs.getObject(4));
        }
        ResultSet resultSet = metaData.getColumns(null, "%", tableName, "%");
        List<Column> columns = new ArrayList<Column>();
        while (resultSet.next()) {
            Column column = new Column();
            column.setColumnName(resultSet.getString("COLUMN_NAME"));
            column.setTypeName(resultSet.getString("TYPE_NAME"));
            column.setFormattedColumnName(replaceUnderLineAndUpperCase(resultSet.getString("COLUMN_NAME")));
            column.setRemarks(resultSet.getString("REMARKS"));
            if (pk.contains(column.getColumnName())) {
                column.isKey();
            }
            columns.add(column);
        }
        return columns;