Чтение метаданных

JDBC включает два интерфейса (DatabaseMetaData, ResultSetMetaData) для получения дополнительной информации MetaData о параметрах подключения к серверу БД, самой базе данных и результирующему набору, извлекаемому из базы данных.

Интерфейс DatabaseMetaData

Метод getMetaData текущего подключения Connection возвращает объект DatabaseMetaData.

public DatabaseMetaData getMetaData() throws SQLException

DatabaseMetaData входит в состав пакета java.sql.* и содержит методы, описывающие таблицы базы данных, поддержку SQL, хранимые процедуры и другие сведения, относящиеся к базе данных и текущему Connection, которые не относятся непосредственно к выполнению команд и извлечению результирующих наборов.

Типы всех столбцов таблицы БД можно получить с помощью метода getColumns класса DatabaseMetaData :

public abstract ResultSet getColumns (String catalog,
                String schema, String table, String columnPattern) 
                throws SQLException

Методу getColumns необходимо передать четыре параметра: наименование каталога, наименование схемы, наименование таблицы и наименование столбца. В следующем коде из базы данных извлекаются метаданные колонок таблицы :

DatabaseMetaData metaData = conn.getMetaData();
ResultSet rset = metaData.getColumns (null, "schemaName", "tableName", "%");

Значение имени каталога определено как null. Это указывает на то, что параметр должен быть удалён из поиска. Не все типы драйверов позволяют передавать имя каталога как null. Символ "%" определен для шаблона имени колонки, который означает, что необходимо получить ВСЕ колонки для таблицы.

Шаблон columnPattern определяет синтаксис, подобно используемому в выражениях SQL оператора LIKE для подбора имён. В частности, символ подчеркивания "_" соответствует любому символу строки, а символ процента "%" соответствует любому количеству последовательных символов в строке. Например, использование шаблона 'j_b' позволяет получать строки «job» и «jab», в то время как шаблон j%b даст любую целевую строку, начинающуюся с «j» и заканчивающуюся на «b», с любым количеством "включая ноль" символом между ними.

Набор данных java.sql.ResultSet, возвращаемый методом getColumns, для каждой колонки таблицы включает 18 описательных полей - это имя столбца, тип значений столбца и т.д. Тип столбца определен константой класса java.sql.Types.

Пример использования DatabaseMetaData :

import java.sql.*;

public class Example_DatabaseMetaData
{
    private  String  userName = "root";
    private  String  password = "****";
    public static void main(String args[])
    {
        try {
            // Загрузка драйвера
            Class.forName("com.mysql.jdbc.Driver");

            // Подключение к серверу БД
            Connection conn = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/student", userName, password);

            // Метаданные текущего подключения
            DatabaseMetaData metaData = conn.getMetaData();
            // Набор данных поддерживаемых типов
            ResultSet rs = metaData.getTypeInfo();
            System.out.println("Набор примитивных типов, поддерживаемых данным типом приложения\n");
            while (rs.next()) {
                System.out.println(rs.getString(1));
            }
            rs.close();
            conn.close();
        } catch (SQLException e) {
            System.out.println(e.toString());
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}

Методы DatabaseMetaData

МетодОписание
getDatabaseProductName() Название сервера базы
getDatabaseProductVersion() Версия сервера
getDriverName() Имя драйвера
getDriverVersion() Версия драйвера
getUserName() Пользователь
getTableTypes() Типы таблиц
getNumericFunctions() Математические функции
getStringFunctions() Строковые функции
getSystemFunctions() Системные функции
getTimeDateFunctions() Дата/Время функции
getExtraNameCharacters() Символы для имён, кроме стандартных
getSchemaTerm() Термин для "схема"
getProcedureTerm() Термин для "процедура"
getCatalogTerm() Термин для "каталог"
getMaxColumnNameLength() Макс. длина имени колонки
getMaxProcedureNameLength() Макс. длина имени процедуры
getMaxTableNameLength() Макс. длина имени таблицы
getMaxColumnsInSelect() Макс. кол-во колонок в SELECT
getMaxStatementLength() Макс. длина SQL запроса
getMaxColumnsInTable() Максимальное кол-во колонок в TABLE
getMaxConnections() Максимальное кол-во одновременных соединений с базой

Интерфейс ResultSetMetaData

Метод getMetaData результирующего набора базы данных класса ResultSet возвращает объект ResultSetMetaData.

public ResultSetMetaData getMetaData() throws SQLException

Класс ResultSetMetaData определяет объект метаданных для текущего набора данных ResultSet. ResultSetMetaData содержит информацию о результирующей таблице - количество колонок, тип значений колонок и т.д.

Пример получения метаданных результирующего запроса :

ResultSet rs = stmt.executeQuery("select * from users");
ResultSetMetaData rsmd = rs.getMetaData();

int cols = rsmd.getColumnCount();
int rownum = 1;
  
while(rsmd.next()) {
    System.out.println("Cтpокa : " + rownum++);
    for (int i = 0; i < cols; i++) {
        System.out.println("\tColumnLabel : '" + rsmd.getColumnLabel (i + 1) + "', " + 
                           "\tDisplaySize : " + rsmd.getColumnDisplaySize (i + 1) + ", " + 
                           "\tColumnType  : '" + rsmd.getColumnType (i + 1) + "', " + 
                           rsmd.getObject(i + 1) + ", ");
    }
}
rs.close();

Для каждого результирующего набора обеспечивается получение экземпляра ResultSetMetaData с помощью метода getMetaData(). При динамическом доступе к базе данных необходимо знать, сколько колонок в результирующем наборе, чтобы извлечь информацию о колонках и их именах для вывода.

Для извлечения метаданных в примере используются методы getColumnCount - количество полей, и getColumnLabel - наименование поля.

  Рейтинг@Mail.ru