索引参数
适用于 ✅ 开源版 ✅ 专业版 ✅ 企业版
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 的章节。
反馈
您对此页面有任何反馈吗? 我们很乐意听到!