2010-05-06 55 views
49

Tôi muốn lấy tất cả tên bảng từ lược đồ cơ sở dữ liệu, và nếu có thể, hãy nhận tất cả bảng bắt đầu bằng tiền tố được chỉ định.Làm thế nào để có được tất cả các tên bảng từ một cơ sở dữ liệu?

Tôi đã thử sử dụng JDBC connection.getMetaData().getTables() nhưng không hoạt động chút nào.

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

Ai đó có thể giúp tôi về điều này?

Trả lời

101

Bạn cần phải lặp qua kết quả gọi số next().

Đây là một ví dụ từ java2s.com:

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

Cột là TABLE_NAME (xem tài liệu của DatabaseMetaData::getTables).

+0

Cảm ơn! bạn đã làm cho ngày của tôi :) –

+2

Nếu điều này không thành công cho bạn (như nó đã làm cho tôi), bạn cần phải chắc chắn rằng người dùng cơ sở dữ liệu thực sự có thể hiển thị các bảng trên cơ sở dữ liệu. –

+1

Nó hiển thị tất cả các bảng trong tất cả các cơ sở dữ liệu. Bạn có thể chuyển tên cơ sở dữ liệu làm tham số đầu tiên để chỉ hiển thị các bảng trong db đó. – Mahdi

4

Nếu bạn muốn sử dụng một API cấp cao, mà giấu đi rất nhiều sự phức tạp JDBC xung quanh siêu dữ liệu giản đồ cơ sở dữ liệu, hãy xem bài viết này: bảng 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

Nó hiển thị tất cả các bảng trong tất cả các cơ sở dữ liệu. Bạn có thể chuyển tên cơ sở dữ liệu làm tham số đầu tiên để chỉ hiển thị các bảng trong db đó. – Mahdi

4

Trong bài toán ví dụ của bạn được truyền tên mẫu trong hàm getTables của DatabaseMetaData.

Một số cơ sở dữ liệu hỗ trợ số nhận dạng chữ hoa, một số số nhận dạng chữ thường hỗ trợ. Ví dụ oracle lấy tên bảng trong trường hợp trên, trong khi postgreSQL lấy nó trong trường hợp thấp hơn.

DatabaseMetaDeta cung cấp một phương pháp để xác định cách các cửa hàng cơ sở dữ liệu nhận dạng, có thể được trộn lẫn trường hợp, chữ hoa, chữ thường see: http://docs.oracle.com/javase/7/docs/api/java/sql/DatabaseMetaData.html#storesMixedCaseIdentifiers()

Từ bên dưới Ví dụ, bạn có thể nhận được tất cả các bảng và quan điểm của cung cấp tên bảng mẫu, nếu bạn chỉ muốn các bảng sau đó xóa "VIEW" khỏi mảng 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; 
    } 
Các vấn đề liên quan