【发布时间】:2014-12-21 20:45:25
【问题描述】:
目前正在探索JOOQ的可能性,我想慎重入手,只使用JOOQ作为SQL builder。我将我的数据库模式定义为从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());
但是一旦语句有更多参数,我就开始对 JOOQ 的实现与setObjects 的第一个参数产生复杂的依赖关系。
我想使用query.getBindValues(),但这只会返回要绑定到语句的普通 Java 对象。我必须假设订单与setObject 的仓位订单匹配,此外我现在错过了getSQLType()。所以这也不是什么好办法。
然后我希望找到类似query.getPreparedStatement(connection) 的东西来从提供的连接创建语句,并很好地填写了所有参数,但这似乎不存在。
是否有一些巧妙的方法可以从我丢失的 JOOQ Query 中获取 PreparedStatement?
【问题讨论】:
-
为了完整起见,您能否添加一个简短的解释说明您为什么不想使用 jOOQ 来执行查询?
-
我还没有准备好将我的灵魂完全卖给 JOOQ :-) 最重要的是,我读到 JOOQ 最初是一个 SQL 构建器,我认为三个职责自然分离:1 ) 获取正确的查询或语句,2) 使用池、连接、语句等处理与数据库的连接,3) 从查询结果中读取数据。通过使用 PreparedStatement 来交换 Connection 和 JOOQ Query 可以很好地分离 (1) 和 (2)。
-
你的灵魂可以奔跑,但它无法隐藏。 jOOQ 已经准备语句 5 年了 - 大公司在生产中使用...不知道你在担心什么:) 从一开始,jOOQ 就将变量绑定到 PreparedStatement。 SQL 提取功能是后来才出现的。无论如何,我会给出答案
标签: prepared-statement jooq sqlbuilder