使用JDBI枚举数据库表

时间:2015-06-18 12:04:36

标签: java mysql jdbc dropwizard jdbi

是否有办法使用JDBI获取有关模式中包含哪些表的信息?

我有两个数据库 A B ,我需要能够

  1. 查询 A 并从中检索表格列表;
  2. 查询 B 并检查那些相同的表是否存在且具有相同的定义(我不关心表中的数据)。
  3. 我可以使用命令行中的mysqldump执行此操作:从每个数据库中检索CREATE TABLE语句并进行比较。但现在我需要在Dropwizard / JDBI上下文中进行测试。

    文档有点稀疏,但我找不到任何合适的东西让我这样做。我或许可以

    handle.execute("show tables");
    
    等等,但这似乎有点低,我希望有更好的方法。

    或者我需要求助于JDBC吗?

2 个答案:

答案 0 :(得分:1)

JDBC有几个独立于数据库提供程序的机制。

从连接中你可以获得DatabaseMetaData,然后对它进行逐个查询(null = any)。

DatabaseMetaData meta = connection.getMetaData();
ResultSet rs = meta.getColumns(...);

注意:此处的名称可能区分大小写等。

答案 1 :(得分:1)

我自己就碰到了这个。 JDBI 没有提供高级API来执行您要求的操作,因此您需要使用 JDBC API。也就是说,如果您不了解,JDBI提供对底层Connection对象的访问作为JDBC的入口点:

DBI dbi = ...;
try (Handle h = dbi.open()) {
  try (Connection c = h.getConnection()) {
    try (ResultSet tables = c.getMetaData().getColumns(null, schema, "%", "%")) {
      // loop over columns/tables here...
    }
  }
}

根据您的要求,您还可以查看Liquibase's diff功能,该功能可以满足您的需求:

liquibase.sh --driver=oracle.jdbc.OracleDriver \
        --url=jdbc:oracle:thin:@testdb:1521:test \
        --username=bob \
        --password=bob \
    diff \
        --referenceUrl=jdbc:oracle:thin:@localhost/XE \
        --referenceUsername=bob \
        --referencePassword=bob