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