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;
反馈
您对此页面有任何反馈吗? 我们很乐意听到您的声音!