Java API для языка определения данных SQL

Прежде чем написать один, есть ли API Java для управления базой данных. Как обертка, ориентированная на объект вокруг java.sql.DatabaseMetaData, с поддержкой таких вещей, как Schema.createTable(name, columns)?

Очевидно, что правильные операторы SQL должны выполняться в фоновом режиме на основе используемой БД.

Меня особенно интересует API для выполнения операторов DDL.

Ответ 2

Многие механизмы объектно-реляционного сопоставления поставляются с инструментами для создания классов модели домена из существующей схемы или создания (или даже обновления) схемы для соответствия классам моделей домена.

В частности, спящий режим может это сделать, см.

http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#toolsetguide-s1

Ответ 3

Насколько я помню, некоторые инструменты, такие как NetBeans, могут создавать/изменять схемы базы данных "на лету". Вы можете посмотреть исходный код, если не найдете конкретную библиотеку.

Ответ 4

Рассматривали ли вы прямые звонки JDBC?

Для контроля и соображений безопасности мне нравится разделять DDL и DML с ORM и JDBC соответственно. Это позволяет менее опытным кодерам сосредоточиться на манипулировании данными (через спящий режим).

Наверно, только моя "старая школа" предвзято....

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

Ответ 5

Java API для DDL в SQL: мне нужно было создать его для моего проекта, поэтому я опубликовал его как open-source: https://bitbucket.org/aragot/play-sql-dialects (лицензия 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);

Ответ 6

Я всегда думал, что если вы использовали подготовленные операторы для своего SQL, вы могли бы без труда изменить соединитель базы данных и переключиться на другую базу данных, в которой есть соответствующие JDBC-коннекторы.

Ответ 7

Мы с успехом применяем интеграцию данных Pentaho (ex-Kettle), хотя API Community Edition плохо документированы. Это может потребовать некоторого взлома, но абстракция и многие функции, которые она предоставляет, могут стоить того.