可用版本:Dev (3.21) | 最新 (3.20) | 3.19 | 3.18 | 3.17 | 3.16 | 3.15 | 3.14 | 3.13 | 3.12 | 3.11

静态语句与预编译语句

适用于 ✅ 开源版   ✅ 专业版   ✅ 企业版

使用 JDBC,您可以完全控制您的 SQL 语句。您可以自行决定是否要执行没有绑定值的静态 java.sql.Statement,或者带有(或不带有)绑定值的 java.sql.PreparedStatement。但您必须尽早决定选择哪种方式。并且在内联绑定变量时,您必须手动防止 SQL 注入和语法错误。

使用 jOOQ,这变得更容易。事实上,这非常简单。使用 jOOQ,您只需在 ConfigurationSettings 中设置一个标志,并且该配置生成的所有查询都将作为静态语句执行,所有绑定值都将被内联。这里给出了一个示例






-- These statements are rendered by the two factories:
SELECT ? FROM DUAL WHERE ? = ?
SELECT 1 FROM DUAL WHERE 1 = 1
// This DSLContext executes PreparedStatements
DSLContext prepare = DSL.using(connection, SQLDialect.ORACLE);

// This DSLContext executes static Statements
DSLContext inlined = DSL.using(connection, SQLDialect.ORACLE,
  new Settings().withStatementType(StatementType.STATIC_STATEMENT));

prepare.select(val(1)).where(val(1).eq(1)).fetch();
inlined.select(val(1)).where(val(1).eq(1)).fetch();

选择其中一个的原因

并非所有数据库都是一样的。如果您使用 java.sql.PreparedStatement,某些数据库会显示出性能提升,因为数据库将能够为相同的 SQL 语句重用执行计划,而不管实际的绑定值如何。这大大提高了软解析 SQL 语句所需的时间。在其他情况下,假设绑定值与 SQL 执行计划无关可能是一个坏主意,因为您可能会遇到“绑定值窥视”问题。您最好花费额外的成本来硬解析 SQL 语句,而不是让数据库微调新计划以适应具体的绑定值。

哪种方法对您来说更佳,jOOQ 无法决定。在大多数情况下,预编译语句可能更好。但您始终可以选择强制 jOOQ 渲染内联绑定值。

在每个绑定值的基础上内联绑定值

请注意,您不必一次内联所有绑定值。如果您知道某个绑定值不是真正的变量,应该显式内联,您可以通过使用 DSL.inline() 来做到这一点,如手册关于 内联参数 的章节中所述

反馈

您对此页面有任何反馈吗? 我们很乐意倾听!

The jOOQ Logo