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

索引参数

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

JDBC 只知道索引绑定值。一个典型的在 JDBC 中使用绑定值的例子如下

try (PreparedStatement stmt = connection.prepareStatement("SELECT * FROM BOOK WHERE ID = ? AND TITLE = ?")) {

    // bind values to the above statement for appropriate indexes
    stmt.setInt(1, 5);
    stmt.setString(2, "Animal Farm");
    stmt.executeQuery();
}

对于动态 SQL,跟踪问号的数量及其对应的索引可能变得困难。jOOQ 抽象了这一点,让你可以在需要的地方提供绑定值。一个简单的例子如下

create.select().from(BOOK).where(BOOK.ID.eq(5)).and(BOOK.TITLE.eq("Animal Farm")).fetch();

// This notation is in fact a short form for the equivalent:
create.select().from(BOOK).where(BOOK.ID.eq(val(5))).and(BOOK.TITLE.eq(val("Animal Farm"))).fetch();

注意使用了 DSL.val() 来显式地创建一个索引绑定值。你不需要担心这个索引。当查询被渲染时,每个绑定值都会渲染一个问号。当查询绑定其变量时,每个绑定值都会生成适当的绑定值索引。

从查询中提取绑定值

如果你决定在 jOOQ 之外运行上述查询,使用你自己的 java.sql.PreparedStatement,你可以如下操作

Select<?> select = create.select().from(BOOK).where(BOOK.ID.eq(5)).and(BOOK.TITLE.eq("Animal Farm"));

// Render the SQL statement:
String sql = select.getSQL();
assertEquals("SELECT * FROM BOOK WHERE ID = ? AND TITLE = ?", sql);

// Get the bind values:
List<Object> values = select.getBindValues();
assertEquals(2, values.size());
assertEquals(5, values.get(0));
assertEquals("Animal Farm", values.get(1));

关于 jOOQ 内部结构的更多细节,请查看手册中关于 QueryParts 的章节。

反馈

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

The jOOQ Logo