Является ли 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);
Другие вопросы по тегам