Ответ 1
DdlUtils из Apache делает это https://db.apache.org/ddlutils/
Прежде чем написать один, есть ли API Java для управления базой данных. Как обертка, ориентированная на объект вокруг java.sql.DatabaseMetaData
, с поддержкой таких вещей, как Schema.createTable(name, columns)
?
Очевидно, что правильные операторы SQL должны выполняться в фоновом режиме на основе используемой БД.
Меня особенно интересует API для выполнения операторов DDL.
DdlUtils из Apache делает это https://db.apache.org/ddlutils/
Многие механизмы объектно-реляционного сопоставления поставляются с инструментами для создания классов модели домена из существующей схемы или создания (или даже обновления) схемы для соответствия классам моделей домена.
В частности, спящий режим может это сделать, см.
http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#toolsetguide-s1
Насколько я помню, некоторые инструменты, такие как NetBeans, могут создавать/изменять схемы базы данных "на лету". Вы можете посмотреть исходный код, если не найдете конкретную библиотеку.
Рассматривали ли вы прямые звонки 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");
}
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);
Я всегда думал, что если вы использовали подготовленные операторы для своего SQL, вы могли бы без труда изменить соединитель базы данных и переключиться на другую базу данных, в которой есть соответствующие JDBC-коннекторы.
Мы с успехом применяем интеграцию данных Pentaho (ex-Kettle), хотя API Community Edition плохо документированы. Это может потребовать некоторого взлома, но абстракция и многие функции, которые она предоставляет, могут стоить того.