jOOQ 生成带有绑定值的 SQL。当您使用 jOOQ 仅渲染 SQL,并使用 Spring 执行它时,您基本上可以选择以下任何一个:
显式使用内联绑定值:
像这样,你可以明确告诉 jOOQ 不要为你的对象渲染任何绑定变量LIMIT .. OFFSET
clause
create.select(DSL.field("table_name"))
.from("tables t")
.where("t.table_schema LIKE '" + schemaName + "'")
.limit(DSL.inline(10))
.offset(DSL.inline(2))
.getSQL();
让 jOOQ 内联所有绑定值:
像这样,你可以告诉 jOOQ 不要渲染任何绑定变量:
Settings settings = new Settings();
settings.setStatementType(StatementType.STATIC_STATEMENT);
DSLContext create = DSL.using(connection, dialect, settings);
// [...]
从 jOOQ 的查询中提取绑定值:
像这样,你可以让 jOOQ 在适当的地方渲染绑定变量,并以正确的顺序提取它们:
Query query =
create.select(DSL.field("table_name"))
.from("tables t")
.where("t.table_schema LIKE '" + schemaName + "'")
.limit(DSL.inline(10))
.offset(DSL.inline(2));
String sql = query.getSQL();
List<Object> bindValues = query.getBindValues();
有关 jOOQ 对绑定值的理解的更多信息:
http://www.jooq.org/doc/latest/manual/sql-building/bind-values/ http://www.jooq.org/doc/latest/manual/sql-building/bind-values/
关于语法完整性和 SQL 注入的注意事项
请注意,您的查询有些容易出错,因为schemaName
如果它源自用户输入,则应进行检查和转义。您可以为其创建一个绑定值,如下所示:
create.select(DSL.field("table_name"))
.from("tables t")
.where("t.table_schema LIKE ?", schemaName)