当前正在探索JOOQ的可能性,我想仔细地开始并仅将JOOQ用作SQL构建器。我将数据库模式定义为来自CustomTable
的类,以获得类型安全性。 这导致了如下代码从jooq查询中创建PreparedStatement
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());
但只要有对语句的详细参数,我开始变得对JOOQ的实现对于setObject
第一个参数复杂的依赖关系。
我以为使用query.getBindValues()
,但这只返回纯Java对象绑定到语句。我必须假设该订单与setObject
的订单订单相匹配,另外我现在错过了getSQLType()
。所以这也不是好方法。
然后我希望找到像query.getPreparedStatement(connection)
这样的东西来创建声明从提供的连接与所有参数很好地填充,但似乎并不存在。
有没有一些简洁的方法可以让我失踪的JOOQ Query
中的PreparedStatement
?
为了完整起见,您可以添加一个简短的解释,说明为什么您不想使用jOOQ来执行查询吗? – 2014-10-26 23:21:06
我还没准备好将自己的灵魂完全卖给JOOQ :-)最重要的是,我读到JOOQ最初是作为一个SQL构建器开始的,我认为有三个职责的自然分离:1)获取查询或语句权限,2)通过池,连接,语句等处理与数据库的连接,3)从查询结果中读取数据。通过获取PreparedStatement来交换Connection和JOOQ查询将允许(1)和(2)很好地分离。 – Harald 2014-10-27 12:06:51
你的灵魂可以跑,但它不能隐藏。 jOOQ一直准备5年的陈述 - 大公司在制作中使用...不确定你在担心什么:)从一开始,jOOQ将变量绑定到PreparedStatement。 SQL提取功能仅在后来才提供。无论如何,我会给出答案 – 2014-10-27 18:41:06