2010-05-06 2 views
49

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

Я пробовал использовать JDBC connection.getMetaData().getTables(), но это не сработало.

Connection jdbcConnection = DriverManager.getConnection("", "", ""); 
DatabaseMetaData m = jdbcConnection.getMetaData(); 
ResultSet tables = m.getTables(jdbcConnection.getCatalog(), null, "TAB_%", null); 
for (int i = 0; i < tables.getMetaData().getColumnCount(); i++) { 
    System.out.println("table = " + tables.getMetaData().getTableName(i)); 
} 

Не мог бы кто-нибудь помочь мне в этом?

ответ

101

Вам необходимо перебрать ваш запрос ResultSet next().

Это пример из java2s.com:

DatabaseMetaData md = conn.getMetaData(); 
ResultSet rs = md.getTables(null, null, "%", null); 
while (rs.next()) { 
    System.out.println(rs.getString(3)); 
} 

Колонка является TABLE_NAME (см документацию DatabaseMetaData::getTables).

+0

Спасибо! вы сделали мой день :) –

+2

Если это не поможет вам (как и мне), вы должны убедиться, что пользователь базы данных может фактически показывать таблицы в базе данных. –

+1

Он отображает все таблицы во всех базах данных. Вы можете передать имя базы данных в качестве первого параметра для отображения таблиц только в этом db. – Mahdi

4

Если вы хотите использовать высокоуровневый API, который скрывает много сложности JDBC вокруг метаданных схемы базы данных, посмотрите на эту статью: http://www.devx.com/Java/Article/32443/1954

26
public void getDatabaseMetaData() 
    { 
     try { 

      DatabaseMetaData dbmd = conn.getMetaData(); 
      String[] types = {"TABLE"}; 
      ResultSet rs = dbmd.getTables(null, null, "%", types); 
      while (rs.next()) { 
       System.out.println(rs.getString("TABLE_NAME")); 
      } 
     } 
      catch (SQLException e) { 
      e.printStackTrace(); 
     } 
    } 
+0

Он отображает все таблицы во всех базах данных. Вы можете передать имя базы данных в качестве первого параметра для отображения таблиц только в этом db. – Mahdi

4

В вашем примере задачи передается таблицы name в функции getTables базы данных DatabaseMataData.

Некоторые базы данных поддерживают идентификатор верхнего регистра, некоторые идентификаторы нижнего регистра поддержки. Например, оракул извлекает имя таблицы в верхнем регистре, а postgreSQL - в нижнем регистре.

DatabaseMetaDeta предоставляет метод для определения того, как хранятся базы данных идентификаторов, могут быть смешаны случай, заглавные буквы, строчные буквы см: http://docs.oracle.com/javase/7/docs/api/java/sql/DatabaseMetaData.html#storesMixedCaseIdentifiers()

Снизу Например, вы можете получить все таблицы и представление о предоставлении имени таблицы шаблона, если вы нужно только таблицы, а затем удалить «VIEW» из массива TYPES.

public class DBUtility { 
    private static final String[] TYPES = {"TABLE", "VIEW"}; 
    public static void getTableMetadata(Connection jdbcConnection, String tableNamePattern, String schema, String catalog, boolean isQuoted) throws HibernateException { 
      try { 
       DatabaseMetaData meta = jdbcConnection.getMetaData(); 
       ResultSet rs = null; 
       try { 
        if ((isQuoted && meta.storesMixedCaseQuotedIdentifiers())) { 
         rs = meta.getTables(catalog, schema, tableNamePattern, TYPES); 
        } else if ((isQuoted && meta.storesUpperCaseQuotedIdentifiers()) 
         || (!isQuoted && meta.storesUpperCaseIdentifiers())) { 
         rs = meta.getTables(
           StringHelper.toUpperCase(catalog), 
           StringHelper.toUpperCase(schema), 
           StringHelper.toUpperCase(tableNamePattern), 
           TYPES 
          ); 
        } 
        else if ((isQuoted && meta.storesLowerCaseQuotedIdentifiers()) 
          || (!isQuoted && meta.storesLowerCaseIdentifiers())) { 
         rs = meta.getTables( 
           StringHelper.toLowerCase(catalog), 
           StringHelper.toLowerCase(schema), 
           StringHelper.toLowerCase(tableNamePattern), 
           TYPES 
          ); 
        } 
        else { 
         rs = meta.getTables(catalog, schema, tableNamePattern, TYPES); 
        } 

        while (rs.next()) { 
         String tableName = rs.getString("TABLE_NAME"); 
         System.out.println("table = " + tableName); 
        } 



       } 
       finally { 
        if (rs!=null) rs.close(); 
       } 
      } 
      catch (SQLException sqlException) { 
       // TODO 
       sqlException.printStackTrace(); 
      } 

    } 

    public static void main(String[] args) { 
     Connection jdbcConnection; 
     try { 
      jdbcConnection = DriverManager.getConnection("", "", ""); 
      getTableMetadata(jdbcConnection, "tbl%", null, null, false); 
     } catch (SQLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 
1
public static ArrayList<String> getTablesList(Connection conn) 
      throws SQLException { 

     ArrayList<String> listofTable = new ArrayList<String>(); 

     DatabaseMetaData md = conn.getMetaData(); 

     ResultSet rs = md.getTables(null, null, "%", null); 

     while (rs.next()) { 
      if (rs.getString(4).equalsIgnoreCase("TABLE")) { 
       listofTable.add(rs.getString(3)); 
      } 
     } 
     return listofTable; 
    } 
Смежные вопросы