目前正在探索JOOQ的可能性,我想仔细开始,只使用JOOQ作为SQL构建器。我将我的数据库模式定义为派生自CustomTable
的类以获得类型安全性。
这导致像
Param<Integer> pId = ...
Query query = context.select(sometable.somefield.max())
.from(sometable)
.where(sometable.id.eq(pId)
;
其中sometable
是一个包含我的一个表实例的变量。
我目前使用query
做的事情类似于
PreparedStatement pstmt = connection.prepareStatement(query.getSQL());
pstmt.setObject(1, pId.getValue(), pId.getDataType().getSQLType());
但是只要语句有更多参数,我就开始就setObject
的第一个参数对JOOQ的实现产生错综复杂的依赖关系。
我想使用query.getBindValues()
,但这只返回要绑定到语句的普通Java对象。我必须假设订单与setObject
的排名顺序匹配,此外我现在错过了getSQLType()
。所以这也不是好事。
然后我希望找到类似query.getPreparedStatement(connection)
之类的内容来从提供的连接创建语句,并填充所有参数,但这似乎不存在。
是否有一些巧妙的方法可以让我失踪的JOOQ PreparedStatement
中出现Query
?
答案 0 :(得分:1)
默认情况下,每次运行Query.execute()
或任何各种ResultQuery.fetch()
方法时,jOOQ会在内部创建PreparedStatements
。我认为允许用户准备语句并通过新方法Query.statement()
访问此类未执行的语句可能是个好主意。我已将此添加为功能请求:
今天,您可以使用您提到的API自己提取SQL并绑定变量,或多或少以您描述的方式提取(注意,还有Query.getParams()
),它返回Param
绑定顺序中的类型。
但是,请注意,提取SQL字符串并直接通过JDBC自行执行,通常没有任何合理的理由(在非常高吞吐量情况下除了SQL字符串缓存)。 jOOQ主要用于呈现SQL 和来执行它。