静态语句与预编译语句
适用于 ✅ 开源版 ✅ 专业版 ✅ 企业版
使用 JDBC,您可以完全控制您的 SQL 语句。您可以自行决定是否要执行没有绑定值的静态 java.sql.Statement
,或者带有(或不带有)绑定值的 java.sql.PreparedStatement
。但您必须尽早决定选择哪种方式。并且在内联绑定变量时,您必须手动防止 SQL 注入和语法错误。
使用 jOOQ,这变得更容易。事实上,这非常简单。使用 jOOQ,您只需在 Configuration 的 Settings 中设置一个标志,并且该配置生成的所有查询都将作为静态语句执行,所有绑定值都将被内联。这里给出了一个示例
-- 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()
来做到这一点,如手册关于 内联参数 的章节中所述
反馈
您对此页面有任何反馈吗? 我们很乐意倾听!