如何从数据库中获取所有表名?
我想从数据库模式中检索所有的表名,并且如果可能的话,得到以指定的前缀开始的所有表。
我尝试使用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)); }
有人可以帮我吗?
你需要迭代你的ResultSet调用next()
。
这是一个来自java2s.com的例子:
DatabaseMetaData md = conn.getMetaData(); ResultSet rs = md.getTables(null, null, "%", null); while (rs.next()) { System.out.println(rs.getString(3)); }
第3列是TABLE_NAME
(请参阅DatabaseMetaData::getTables
文档)。
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(); } }
如果您想要使用高级API,这会隐藏很多关于数据库模式元数据的JDBC复杂性,请参阅本文: http : //www.devx.com/Java/Article/32443/1954
在你的例子中,问题是在DatabaseMetaData的getTables函数中传递表名模式。
有些数据库支持大写标识符,有些支持小写字母标识符。 例如oracle以大写的方式获取表名,而postgreSQL以小写的方式获取。
DatabaseMetaDeta提供了一种确定数据库如何存储标识符的方法,可以是大小写混合,大小写,小写forms: http : //docs.oracle.com/javase/7/docs/api/java/sql/DatabaseMetaData.html#storesMixedCaseIdentifiers( )
从下面的例子中,你可以得到所有提供表名模式的表和视图,如果你只想要表,那么从TYPES数组中删除“VIEW”。
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(); } } }
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; }