В настоящее время я работаю над приложением базы данных Java, которое я хочу быть полностью автономным (т. Е. Один файл .jar и файл конфигурации, больше ничего). Это действительно небольшой проект, и у меня нет причудливых конвейеров сборки и дополнительных данных приложений, как для коммерческой базы кода - отсюда и желание простого решения с одним jar.
Часть достижения этого включает в себя внедрение H2 в приложение и настройку базы данных во время выполнения. Однако я не уверен, как применить мою желаемую схему в этом случае использования. Давайте использовать эту таблицу в качестве примера.
+-------------+------------+----------+---------+
| Column name | Data type | Nullable | Default |
+-------------+------------+----------+---------+
| id | BIGINT | FALSE | - |
| prefix | VARCHAR(3) | FALSE | 'g!' |
+-------------+------------+----------+---------+
Вот мои два решения.
Программно раскладываем столы с помощью jOOQ:
try (DSLContext ctx = DSL.using(dataSource, SQLDialect.MYSQL)) {
ctx.createTableIfNotExists("guilds")
.column("id", SQLDataType.BIGINT.nullable(false))
.column("prefix", SQLDataType.VARCHAR(3).nullable(false).defaultValue("g!"))
.constraint(constraint("PK_GUILDS").primaryKey(field("id")))
.execute();
}
Естественно, в этом случае я не могу использовать генерацию кода в jOOQ, так как не для чего генерировать классы. Это работает и является полностью программным, но это действительно уродливо и забивает класс статическим импортом. Расширение его для добавления большего количества таблиц и / или столбцов является болезненным и делает код еще менее читабельным.
Другая вещь, которую я попробовал, была Flyway, которая довольно проста и не так ужасна. Все, что мне нужно, это небольшой .sql
файл, который устанавливает мою схему, например:
create table guilds(
id BIGINT NOT NULL,
prefix VARCHAR(3) NOT NULL,
PRIMARY KEY(id)
);
Затем я могу запустить задачу Gradle, чтобы сгенерировать пустую базу данных H2 со всеми таблицами, уже настроенными и готовыми к работе. Gradle даже позволяет мне указать эту задачу для запуска прямо перед сборкой. В этом случае я также могу использовать генерацию кода jOOQ, что значительно облегчает работу lot . Хотя все это происходит во время компиляции, поэтому, насколько я понимаю, мне пришлось бы упаковывать приложение с пустым файлом базы данных. Это, конечно, не соответствует желанию одной банки, которое я изначально хотел.
Есть ли чистый, "обычный" способ сделать это или же создание приложения таким способом - просто не то, что кто-либо делает, когда задействована база данных?