是由JOOQ生成的api依赖于DBMS吗?

时间:2013-03-19 15:31:26

标签: mysql oracle hsqldb jooq

我已从本地HSQLDB(DBMS)使用Jooq生成API。测试运行正常。 但是当我尝试使用像MySQL这样的另一个DBMS运行测试时,我会遇到异常。 另外,我已经看到MySQL生成的API属性区分大小写,而HSQLDB则没有。

我的问题:是否有可能与Joooq本地开发HSQLDB并使用Oracle或MySQL运行实时系统?

1 个答案:

答案 0 :(得分:4)

可以将jOOQ与多个数据库一起使用。我jOOQ User Group使用jOOQ认识的最“大胆”的用户使用至少五个不同的(高效!)数据库系统(其中包括:Oracle,SQL Server,Sybase)。

但请注意,jOOQ只会在一定程度上抽象您的数据库。只要您使用特定于供应商的功能,就可能会遇到问题。 jOOQ不会保证,所有呈现的SQL都可以在您的所有数据库上运行。它只是简化标准化任务。

由于您正在尝试将HSQLDB与Oracle结合使用,因此存在问题的功能(包括许多其他功能):

  • Oracle对DATE数据类型
  • 的不同实现
  • Oracle的分析功能
  • 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`...(MySQL)
  • 维护所有数据库中的等效数据类型和数据

另一方面,您可以安全地使用jOOQ和jOOQ的SQL抽象功能

  • 大部分功能
  • 大多数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);