Java 带有准备好的语句的 JOOQ

Java JOOQ with Prepared Statements

我正在将 JOOQ 与 Microsoft SQL Server 2019 一起使用。它在此参考文献中指出,

https://www.jooq.org/doc/3.0/manual/sql-execution/performance-considerations/

It takes some time to render SQL strings. Internally, jOOQ reuses the same java.lang.StringBuilder for the complete query, but some rendering elements may take their time. You could, of course, cache SQL generated by jOOQ and prepare your own java.sql.PreparedStatement objects

我正在阅读有关 Java 准备语句 Prepared SQL 的资源,这一行对我来说没有意义,You could, of course, cache SQL generated by jOOQ and prepare your own java.sql.PreparedStatement objects。使用 PreparedStatement 不会只是添加另一种语言并降低 JOOQ 的整个目的 type/string 安全吗? JOOQ 甚至如何与 Prepared 语句一起使用?这个有代码解释吗?尝试使用此策略编写代码。

String sql = "select * from people where id=?";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setLong(123);

Does jooq has any performance lead over simple sql in java

如链接文档页面(“明智地优化”)和我的 中所述,您可能不应该担心这些事情 - 当然不是先验的。

要回答您的问题,您可以像这样从任何 jOOQ 查询中提取 SQL 字符串和绑定值:

String sql = query.getSQL();
List<Object> binds = query.getBindValues();

然后用它们做任何你喜欢的事情,包括缓存值和准备你自己的语句,而不是直接用 jOOQ 执行查询。

但同样,正如该链接页面中声明的那样,您不应该预先担心任何此类开销。 SQL 字符串生成的开销在 运行 对几乎没有数据的内存 H2 数据库进行 10000 次相同的琐碎查询时是可测量的,但是当 运行 通过网络进行普通查询时则不是针对具有真实世界工作负载的远程 SQL 服务器。

此外,使用这种方法,您将放弃 jOOQ 在执行您的查询时提供的许多不错的功能 (e.g. the new MULTISET operator)