Является ли JOOQ сгенерированный API зависит от СУБД?
Я сгенерировал API с Jooq из локальной HSQLDB (СУБД). И тесты проходят нормально. Но я получаю исключения при попытке запустить тест с другой СУБД, такой как MySQL. Кроме того, я видел, что сгенерированные API-атрибуты MySQL чувствительны к регистру, а HSQLDB - нет.
Мой вопрос: возможно ли разработать локальный Jooq с HSQLDB и запустить работающую систему с Oracle или MySQL?
1 ответ
Можно использовать jOOQ с несколькими базами данных. Самые "смелые" пользователи, известные мне из группы пользователей jOOQ, используют jOOQ как минимум с пятью разными (производительными!) Системами баз данных (среди которых: Oracle, SQL Server, Sybase).
Обратите внимание, что jOOQ будет только абстрагировать вашу базу данных в определенной степени. Как только вы используете специфичные для поставщика функции, у вас могут возникнуть проблемы. jOOQ не гарантирует, что весь представленный SQL будет работать на всех ваших базах данных. Это просто упростит задачу стандартизации.
Поскольку вы пытаетесь объединить HSQLDB и Oracle, проблемные функции включают (среди многих других):
- Oracle отличается от реализации
DATE
тип данных - Аналитические функции Oracle
- Оракул уступает
VARCHAR
/VARCHAR2
типы данных - Oracle расширен
FOR UPDATE
синтаксис - Oracle расширен
MERGE
синтаксис - Сильно типизированные, именованные типы массивов Oracle - в отличие от типов массивов HSQLDB
- Отсутствие у Oracle явного
INTEGER
типы данных (в частности, для хранимых процедур) - Поддержка Oracle для пакетов и UDT
- Oracle не поддерживает пустые строки (
''
а такжеNULL
подобные) - Разделенное внешнее соединение Oracle
- Oracle,
PIVOT
/UNPIVOT
статьи
Конечно, несовместимость сохраняется и тогда, когда jOOQ явно не поддерживает функцию. К ним относятся (среди многих других):
- Oracle AQ
- Oracle,
MODEL
пункт
Кроме того, вы сами несете ответственность за
- Сохранение эквивалентных метаданных во всех базах данных (в случае сомнений используйте имена таблиц / столбцов с учетом регистра, т.е. путем записи
CREATE TABLE "MY_TABLE"...
(Oracle, HSQLDB) илиCREATE TABLE `MY_TABLE`...
(Баз данных) - Поддержание эквивалентных типов данных и данных во всех базах данных
С другой стороны, вы можете безопасно использовать возможности абстракции SQL jOOQ и jOOQ для
- Большинство функций
- Большинство предложений SQL, включая сложные вложенные SQL
Для получения дополнительной информации, пожалуйста, рассмотрите org.jooq.Support
Javadoc. Эта аннотация используется на всех элементах API для документирования возможности jOOQ имитировать базовое предложение / функцию SQL на соответствующих диалектах.
Кроме того, если вашей единственной проблемой является чувствительность к регистру имен таблиц, расскажите jOOQ не заключать в кавычки имена через настройки jOOQ: http://www.jooq.org/doc/3.0/manual/sql-building/executor/custom-settings/
Пример:
// This DSLContext will not render quoted table / column names:
Settings settings = new Settings().withRenderNameStyle(RenderNameStyle.AS_IS);
DSLContext create = DSL.using(connection, dialect, settings);