纯SQL QueryParts
适用于 ✅ 开源版 ✅ 专业版 ✅ 企业版
如果您不需要将相当复杂的 QueryParts 集成到 jOOQ 中,那么使用简单的 纯 SQL 功能可能更安全,您可以为 jOOQ 提供嵌入式 SQL 的简单字符串表示形式。jOOQ API 中的纯 SQL 方法有两种形式。
- method(String, Object...): 这是一种接受 SQL 字符串和一系列绑定值的方法,这些绑定值将被绑定到 SQL 字符串中包含的变量
- method(String, QueryPart...): 这是一种接受 SQL 字符串和一系列 QueryParts 的方法,这些 QueryParts 将在其各自的占位符的位置“注入”到 SQL 字符串中
以上区别最好用一个例子来解释
// Plain SQL using bind values. The value 5 is bound to the first variable, "Animal Farm" to the second variable: create.selectFrom(BOOK).where( "BOOK.ID = ? AND TITLE = ?", // The SQL string containing bind value placeholders ("?") 5, // The bind value at index 1 "Animal Farm" // The bind value at index 2 ).fetch(); // Plain SQL using embeddable QueryPart placeholders (counting from zero). // The QueryPart "index" is substituted for the placeholder {0}, the QueryPart "title" for {1} Field<Integer> id = val(5); Field<String> title = val("Animal Farm"); create.selectFrom(BOOK).where( "BOOK.ID = {0} AND TITLE = {1}", // The SQL string containing QueryPart placeholders ("{N}") id, // The QueryPart at index 0 title // The QueryPart at index 1 ).fetch();
请注意,由于历史原因,这两种 API 用法也可以混合使用,尽管不建议这样做,并且确切的行为未指定。
纯 SQL 模板规范
使用 QueryPart 占位符(或绑定值占位符)进行模板化需要在 SQL 字符串上应用简单的解析逻辑。jOOQ 模板解析器按照以下规则运行
- 单行注释(在所有数据库中以
--
开头,或在 MySQL 中以#
开头)会被无修改地呈现。此类注释中的任何绑定变量或 QueryPart 占位符都会被忽略。 - 多行注释(在所有数据库中以
/*
开头,以*/
结尾)会被无修改地呈现。此类注释中的任何绑定变量或 QueryPart 占位符都会被忽略。 - 字符串字面量(在所有数据库中以
'
开头和结尾,所有数据库都支持通过复制来转义引号字符,例如:''
,或者在 MySQL 中,如果Settings.backslashEscaping
已启用,则通过转义为:\'
)会被无修改地呈现。此类注释中的任何绑定变量或 QueryPart 占位符都会被忽略。 - 带引号的名称(在大多数数据库中以
"
开头和结尾,在 MySQL 中以`
开头,或在 T-SQL 数据库中以[
和]
开头)会被无修改地呈现。此类注释中的任何绑定变量或 QueryPart 占位符都会被忽略。 - JDBC 转义语法 (
{fn ...}
,{d ...}
,{t ...}
,{ts ...}
) 会被无修改地呈现。此类注释中的任何绑定变量或 QueryPart 占位符都会被忽略。 - 绑定变量占位符(
?
或:name
用于命名绑定变量)将被匹配的绑定值替换,如果启用了内联,例如通过Settings.statementType == STATIC_STATEMENT
。 - QueryPart 占位符 (
{number}
) 将被匹配的 QueryPart 替换。 - 关键字 (
{identifier}
) 被视为关键字,并根据Settings.renderKeywordStyle
以正确的形式呈现。
模板工具
提供了各种 API 来创建用于上述模板机制的模板元素。这些工具可以在 org.jooq.impl.DSL
中找到
// Keywords (which are rendered according to Settings.renderKeywordStyle) can be specified as such: public static Keyword keyword(String keyword) { ... } // Identifiers / names (which are rendered according to Settings.renderNameStyle) can be specified as such: public static Name name(String... qualifiedName) { ... } // QueryPart lists (e.g. IN-lists for the IN predicate) can be generated via these methods: public static QueryPart list(QueryPart... parts) { ... } public static QueryPart list(Collection<? extends QueryPart> parts) { ... }
反馈
您对此页面有任何反馈吗? 我们很乐意听到您的意见!