SQL解析器API
适用于 ✅ 开源版 ✅ 专业版 ✅ 企业版
目标
从历史上看,jOOQ 在 Java 中实现了一种 内部领域特定语言,它生成 SQL(一种外部领域特定语言),用于 JDBC。jOOQ API 由两部分组成:DSL API 和 模型 API,其中 DSL API 在模型 API 之上为程序员添加了词法便利性,而模型 API 实际上只是一个 SQL 表达式树,类似于 SQL 解析器在任何数据库内部所做的事情。
有了这个解析器,整个 jOOQ 功能现在也将提供给任何不直接使用 jOOQ 的人,包括 JDBC 和/或 JPA 用户,例如,通过 解析连接,它在将所有 JDBC 连接调用转发到数据库之前,先将其代理到 jOOQ 解析器,或者通过 DSLContext.parser() API,它允许更低级别的直接访问解析器,例如,用于在 jOOQ 之上构建工具。
可能性是无限的,包括标准化的、基于 SQL 字符串的数据库迁移,这些迁移适用于 jOOQ 支持的任何 SQLDialect。
示例
这个解析器 API 允许将任意 SQL 字符串片段解析为各种 jOOQ API 元素
-
Parser.parse(String):这会生成org.jooq.Queries类型,其中包含一批查询。 -
Parser.parseQuery(String):这会生成org.jooq.Query类型,其中包含单个查询(任何类型的查询)。 -
Parser.parseResultQuery(String):这会生成org.jooq.ResultQuery类型,其中包含单个结果查询(SELECT或其他)。 -
Parser.parseSelect(String):这会生成org.jooq.Select类型,其中包含单个 SELECT 查询。 -
Parser.parseStatement(String):这会生成org.jooq.Statement类型,其中包含单个 过程语句。 -
Parser.parseTable(String):这会生成org.jooq.Table类型,其中包含表表达式。 -
Parser.parseField(String):这会生成org.jooq.Field类型,其中包含字段表达式。 -
Parser.parseRow(String):这会生成org.jooq.Row类型,其中包含行表达式。 -
Parser.parseCondition(String):这会生成org.jooq.Condition类型,其中包含条件表达式。 -
Parser.parseName(String):这会生成org.jooq.Name类型,其中包含名称表达式。
请参阅这篇博客文章 了解有关各种 jOOQ 类型的更多信息。
该解析器能够解析任何未指定的方言,以生成 SQL 表达式的 jOOQ 表示形式,例如
ResultQuery<?> query =
DSL.using(configuration)
.parser()
.parseResultQuery("SELECT * FROM (VALUES (1, 'a'), (2, 'b')) t(a, b)")
上面的 SQL 查询是有效的标准 SQL,可以在 PostgreSQL 和 SQL Server 等数据库上直接运行。但是,从此 SQL 字符串生成的 jOOQ ResultQuery 也适用于任何其他数据库,因为 jOOQ 可以模拟此处使用的两个有趣的 SQL 功能
- VALUES() 构造函数
- 派生列列表语法(一次为表和列创建别名)
查询在支持 VALUES() 但不支持派生列列表的 H2 数据库上可能会呈现如下
select
t.a,
t.b
from (
(
select
null a,
null b
where 1 = 0
)
union all (
select *
from (values
(1, 'a'),
(2, 'b')
) t
)
) t;
或者在 Oracle 上像这样,它不支持这两个功能
select
t.a,
t.b
from (
(
select
null a,
null b
from dual
where 1 = 0
)
union all (
select *
from (
(
select
1,
'a'
from dual
)
union all (
select
2,
'b'
from dual
)
) t
)
) t;
反馈
您对此页面有任何反馈吗? 我们很乐意听到您的声音!