用于SQL数据定义语言的Java API

用于SQL数据定义语言的Java API,java,sql,database,ddl,Java,Sql,Database,Ddl,在我写之前,是否有一个用于操作数据库的JavaAPI。类似于围绕java.sql.DatabaseMetaData的面向对象包装,支持Schema.createTable(名称、列) 显然,正确的SQL语句应该基于所使用的数据库在后台执行 我对执行DDL语句的API特别感兴趣。我一直认为,如果您为SQL使用准备好的语句,那么您可以毫不费力地更改数据库连接器并切换到其他数据库,一个具有相关JDBC连接器的工具。据我所知,一些工具(如NetBeans)可以动态创建/修改数据库模式。如果找不到特定的库

在我写之前,是否有一个用于操作数据库的JavaAPI。类似于围绕
java.sql.DatabaseMetaData
的面向对象包装,支持
Schema.createTable(名称、列)

显然,正确的SQL语句应该基于所使用的数据库在后台执行


我对执行DDL语句的API特别感兴趣。

我一直认为,如果您为SQL使用准备好的语句,那么您可以毫不费力地更改数据库连接器并切换到其他数据库,一个具有相关JDBC连接器的工具。

据我所知,一些工具(如NetBeans)可以动态创建/修改数据库模式。如果找不到特定的库,可以查看源代码。

您考虑过使用直接的JDBC调用吗

出于控制和安全的原因,我喜欢将DDL和DML分别与ORM和JDBC分开。这使得经验较少的程序员能够专注于数据操作(通过hibernate)

可能只是我的“老派”偏见

Hibernate可以执行一些DDL功能,但是我还没有为此广泛使用它。例如,我认为它不能动态创建表(即在运行的现有数据库上)

public static void createEmployees()
{
    Connection con = getConnection();

    String createString;
    createString = "create table Employees (" +
                        "Employee_ID INTEGER, " +
                        "Name VARCHAR(30))";
    try {
        stmt = con.createStatement();
        stmt.executeUpdate(createString);
        stmt.close();
        con.close();

    } catch(SQLException ex) {
        System.err.println("SQLException: " + ex.getMessage());
    }
    JOptionPane.showMessageDialog(null,"Employees Table Created");
}

许多对象关系映射框架都附带了一些工具,可以从现有模式中生成域模型类,或者创建(甚至更新)一个模式以匹配域模型类

尤其是hibernate可以做到这一点,请参见


我们使用Pentaho数据集成(ex-Kettle)取得了一些成功,尽管社区版API的文档很少。它可能需要一些黑客攻击,但它提供的抽象和许多功能可能是值得的。

SQL中用于DDL的Java API:我不得不为我的项目构建一个,因此我将其发布为开源:(APL2许可证)

许可证上说,只要您遵守条款,衍生并包含在销售项目中是可以的

PostgreSQL只有一个完整的方言。请随时为MySQL或Oracle提供支持。不幸的是,Oracle和MySQL不支持事务性DDL,因此在发生异常时,您需要恢复数据库的状态,这就是我不想麻烦的原因

例如:

    if (rDialect.hasSchema("schema_test")) {
        rDialect.dropSchema("schema_test");
    }

    rDialect.createSchema("schema_test");
    rDialect.setDefaultSchema("schema_test");
    DDLColumn colID = new DDLColumn("ID", "#", null, null, null, DDLColumn.DataType.INTEGER, null, null, null);
    DDLColumn colPOSITION = new DDLColumn("POSITION", "POSITION", null, null, null, DDLColumn.DataType.TEXT, null, null, null);
    DDLColumn column1 = new DDLColumn("COL1", "Column 1", null, "integer-renderer", null, DDLColumn.DataType.INTEGER, null, null, null);
    DDLColumn column2 = new DDLColumn("COL2", "Column 2", null, "as-string", null, DDLColumn.DataType.TEXT, null, null, null);
    DDLTable table = new DDLTable(true, "test1", "Test 1", colID, colPOSITION, column1, column2);
    rDialect.createTable(table);

来自Apache的DdlUtils这是不是您研究过许多可用的ORM框架中的一个?是的,它们为DML提供了很好的API。我对DDL API感兴趣。啊,明白了。您可能希望更改问题标题,以便更清楚地表明您正在寻找的是DDL API而不是DML API(可能是“用于定义数据库的Java API”)。是的,您是对的。重新阅读这个问题,整个DDL需求并不明显。JOOQ非常支持DML api,但它只对开源数据库免费。。。如果你有足够的钱在商业数据库上使用,也许你可以考虑使用它。不幸的是,QueryDSL已经放弃了DDL操作支持。Apache DdlUtils不受影响,不支持新的dbs。。play sql方言比DdlUtils更新,但不包括许多数据库,需要贡献。。。Liquibase是一个很有前途的抽象迁移工具(我见过最好的数据库支持),但它只能作为一个迁移工具使用,主要是XML格式,它的java api对于java程序员来说并不流畅。PreparedStatements用于DML操作。我目前使用的是普通的JDBC,但我想动态检索注册表项名称,并使用相同的代码库在各种不同的DB引擎中创建表。需要一些抽象。不完全是我要找的,但我会看看源代码-它可能包含我要找的。因此,没有这样的API作为独立的包随时可用,但可能存在于现有的开源软件中。接受最接近我想要的东西。