java - 带有准备好的语句的 Java JOOQ
问题描述
我正在将 JOOQ 与 Microsoft SQL Server 2019 一起使用。它在此参考中指出,
https://www.jooq.org/doc/3.0/manual/sql-execution/performance-considerations/
呈现 SQL 字符串需要一些时间。在内部,jOOQ 为完整的查询重用了相同的 java.lang.StringBuilder,但是一些渲染元素可能需要一些时间。当然,您可以缓存 jOOQ 生成的 SQL 并准备您自己的 java.sql.PreparedStatement 对象
我正在阅读有关 Java Prepared statements Prepared SQL的资源这行对我来说没有意义,You could, of course, cache SQL generated by jOOQ and prepare your own java.sql.PreparedStatement objects
. 使用 PreparedStatement 不会只是添加另一种语言并降低 JOOQ 的类型/字符串安全的整个目的吗?JOOQ 甚至如何与 Prepared 语句一起使用?有代码解释吗?尝试使用这种策略编写代码。
String sql = "select * from people where id=?";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setLong(123);
解决方案
正如那个链接的文档页面(“明智地优化”)和我之前的回答中提到的,你可能不应该担心这些事情——当然不是先验的。
要回答您的问题,您可以从任何 jOOQ 查询中提取 SQL 字符串并绑定值,如下所示:
String sql = query.getSQL();
List<Object> binds = query.getBindValues();
然后对它们做任何你喜欢的事情,包括缓存值和准备你自己的语句,而不是直接使用 jOOQ 执行查询。
但是,正如该链接页面所声明的那样,您不必担心任何此类开销。例如,在对几乎没有数据的内存 H2 数据库运行 10000 次相同的普通查询时,SQL 字符串生成的开销是可测量的,但在通过网络对具有真实世界工作负载的远程 SQL Server 运行普通查询时则不然。
此外,使用这种方法,您将放弃 jOOQ 在执行查询时提供的许多不错的功能(例如 newMULTISET
运算符)
推荐阅读
- javascript - 在react-redux、redux-thunk中依次调用多个action
- sql-server - 是否可以在 SSAS 中存储 SSAS 对象的自定义元数据?(用于版本控制)
- android - 在 Android 中手动设置蓝牙服务器端口
- neural-network - 如何解释没有预测到负面?
- c# - 事件的类字段实现
- variables - Visual Studio Fortran 卡在将值从一个变量重新分配给另一个变量
- php - 搜索任何表字段中是否存在变量并获取表字段名称
- php - 使用数据库值的 Smarty 计算
- r - 使用 grepl() 从 R 中的数据框中删除值
- java - 如何处理 RequestMapping 中的@Valid 违规行为?