纯SQL API
适用于 ✅ 开源版 ✅ 专业版 ✅ 企业版
jOOQ 允许您将 SQL 作为字符串嵌入到任何受支持的语句中,在以下上下文中
普通 SQL API 方法通常以三种方式重载。 让我们看一下 condition
查询部分构造函数
// Construct a condition without bind values // Example: condition("a = b") @PlainSQL Condition condition(String sql); // Construct a condition with bind values // Example: condition("a = ?", 1); @PlainSQL Condition condition(String sql, Object... bindings); // Construct a condition taking other jOOQ object arguments // Example: condition("a = {0}", val(1)); @PlainSQL Condition condition(String sql, QueryPart... parts);
请注意 @PlainSQL
注释,它可以与jOOQ checker 一起使用,以完全禁止或局部禁止使用普通 SQL API,从而提高 SQL 注入保护。
绑定值和查询部分参数重载都支持 jOOQ 的普通 SQL 模板语言。 有关更多详细信息,请参阅org.jooq.impl.DSL
Javadoc。
以下是来自 DSL 的普通 SQL 构造方法的更完整的列表
// A condition Condition condition(String sql); Condition condition(String sql, Object... bindings); Condition condition(String sql, QueryPart... parts); // A field with an unknown data type Field<Object> field(String sql); Field<Object> field(String sql, Object... bindings); Field<Object> field(String sql, QueryPart... parts); // A field with a known data type <T> Field<T> field(String sql, Class<T> type); <T> Field<T> field(String sql, Class<T> type, Object... bindings); <T> Field<T> field(String sql, Class<T> type, QueryPart... parts); <T> Field<T> field(String sql, DataType<T> type); <T> Field<T> field(String sql, DataType<T> type, Object... bindings); <T> Field<T> field(String sql, DataType<T> type, QueryPart... parts); // A field with a known name (properly escaped) Field<Object> field(Name name); <T> Field<T> field(Name name, Class<T> type); <T> Field<T> field(Name name, DataType<T> type); // A function <T> Field<T> function(String name, Class<T> type, Field<?>... arguments); <T> Field<T> function(String name, DataType<T> type, Field<?>... arguments); // A table Table<?> table(String sql); Table<?> table(String sql, Object... bindings); Table<?> table(String sql, QueryPart... parts); // A table with a known name (properly escaped) Table<Record> table(Name name); // A query without results (update, insert, etc) Query query(String sql); Query query(String sql, Object... bindings); Query query(String sql, QueryPart... parts); // A query with results ResultQuery<Record> resultQuery(String sql); ResultQuery<Record> resultQuery(String sql, Object... bindings); ResultQuery<Record> resultQuery(String sql, QueryPart... parts); // A query with results. This is the same as resultQuery(...).fetch(); Result<Record> fetch(String sql); Result<Record> fetch(String sql, Object... bindings); Result<Record> fetch(String sql, QueryPart... parts);
除了通用工厂方法之外,为了方便起见,普通 SQL 也在各种其他上下文中可用。 例如,当向查询添加 .where("a = b")
子句时。 因此,存在几种方便的方法,可以在其中有效地插入普通 SQL。 这是一个在一个查询中显示所有各种用例的示例
// You can use your table aliases in plain SQL fields // As long as that will produce syntactically correct SQL Field<?> LAST_NAME = field("a.LAST_NAME"); // You can alias your plain SQL fields Field<?> COUNT1 = field("count(*) x"); // If you know a reasonable Java type for your field, you // can also provide jOOQ with that type Field<Integer> COUNT2 = field("count(*) y", Integer.class); // Use plain SQL as select fields create.select(LAST_NAME, COUNT1, COUNT2) // Use plain SQL as aliased tables (be aware of syntax!) .from("author a") .join("book b") // Use plain SQL for conditions both in JOIN and WHERE clauses .on("a.id = b.author_id") // Bind a variable in plain SQL .where("b.title != ?", "Brida") // Use plain SQL again as fields in GROUP BY and ORDER BY clauses .groupBy(LAST_NAME) .orderBy(LAST_NAME) .fetch();
关于普通 SQL 的重要说明!
使用普通 SQL 时,需要记住一些重要事项
- 您必须提供一些在语法上正确的东西。 如果不是,那么 jOOQ 将不会知道。 只有您的 JDBC 驱动程序或您的 RDBMS 才会检测到语法错误。
- 当您使用变量绑定时,必须提供一致性。 ? 的数量必须与变量的数量匹配
- 您的 SQL 将插入到 jOOQ 查询中,无需进一步检查。 因此,jOOQ 无法阻止 SQL 注入或以任何方式转换您的 SQL 字符串。
反馈
您对此页面有任何反馈吗? 我们很乐意听取您的意见!