如何使用jOOQ来处理多个数据库引擎,取决于配置。

问题描述 投票:1回答:1

我是一个经验丰富的快乐的jOOQ用户。

我现在正在做一个项目,需要支持多个数据库引擎(至少是PostgreSQL,MySQL,Oracle)。

我们想要一个足够低级的东西来控制我们的查询。JPAHibernate对我们来说太高了。

我知道jOOQ是和元模型一起工作的,而这个元模型是由数据库模式生成的。

有没有办法在不同的数据库引擎上重用相同的jOOQ查询定义(除了引擎的特殊差异,使用相同的模式)?

如果我们需要重新编译java类的话,可以。编译时的配置对我们来说很好。

mysql oracle postgresql jooq
1个回答
2
投票

jOOQ就是为此而设计的。你需要做这些事情。

  1. 有一个 Configuration 附带 SQLDialect 准备好了,这取决于你的JDBC连接。这是最简单的部分。这是很简单的部分。Configuration 将为您的所有 jOOQ 查询自动生成特定供应商的 SQL。这可以在运行时完成。不需要任何编译时的调整。
  2. 确保你的表列总是使用相同的情况。或关闭jOOQ的标识符中的引号 为不区分大小写的行为(根据你的MySQL配置,这可能还不够。参见MySQL手册). 然后,你可以在所有其他方言上重复使用你的任何数据库方言中生成的代码。
  3. 请确保你只使用注有 @Support({ MYSQL, ORACLE, POSTGRES }). 例如: DSL.toDate() 不能使用,因为它不支持MySQL,但可以使用 DSL.trunc() 可以使用,因为这三种目标方言都存在。

我们也越来越多地在jOOQ手册中加入特定方言的信息,例如对于 SHL() 功能:

-- ASE, HSQLDB, SQLDATAWAREHOUSE, SQLSERVER, SYBASE
(1 * CAST(power(2, 4) AS int))

-- AURORA_MYSQL, AURORA_POSTGRES, COCKROACHDB, CUBRID, MARIADB, MEMSQL, MYSQL, POSTGRES, SQLITE, VERTICA
(1 << 4)

-- DB2, INFORMIX
(1 * CAST(power(2, 4) AS integer))

-- FIREBIRD
bin_shl(1, 4)

-- H2
lshift(1, 4)

-- ORACLE
(1 * CAST(power(2, 4) AS number(10)))

-- TERADATA
shiftleft(1, 4)

-- ACCESS, DERBY, HANA, INGRES, REDSHIFT
/* UNSUPPORTED */

为了确保你不会不小心写出一个不能在某些方言上运行的查询,你可以。

  1. 运行集成测试,例如:使用 试管员 对每一种目标方言
  2. 使用 jOOQ的检查器框架或ErrorProne集成。 用于静态代码分析。也请看这里的博客文章.
© www.soinside.com 2019 - 2024. All rights reserved.