2014-10-26 97 views
1

當前正在探索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

+0

爲了完整起見,您可以添加一個簡短的解釋,說明爲什麼您不想使用jOOQ來執行查詢嗎? – 2014-10-26 23:21:06

+0

我還沒準備好將自己的靈魂完全賣給JOOQ :-)最重要的是,我讀到JOOQ最初是作爲一個SQL構建器開始的,我認爲有三個職責的自然分離:1)獲取查詢或語句權限,2)通過池,連接,語句等處理與數據庫的連接,3)從查詢結果中讀取數據。通過獲取PreparedStatement來交換Connection和JOOQ查詢將允許(1)和(2)很好地分離。 – Harald 2014-10-27 12:06:51

+0

你的靈魂可以跑,但它不能隱藏。 jOOQ一直準備5年的陳述 - 大公司在製作中使用...不確定你在擔心什麼:)從一開始,jOOQ將變量綁定到PreparedStatement。 SQL提取功能僅在後來才提供。無論如何,我會給出答案 – 2014-10-27 18:41:06

回答

1

默認情況下,每當您運行Query.execute()或任何各種ResultQuery.fetch()方法時,jOOQ會在內部創建PreparedStatements。我認爲,允許用戶準備聲明並通過新方法Query.statement()訪問這些未執行的聲明可能是一個好主意。我已經添加了這是一個功能要求:

已經在今天,你可以提取SQL,並使用你所提到的API自己綁定變量,在路上或多或少你(注意,還有Query.getParams()),它以綁定順序返回Param類型。

但是,請注意,通常沒有任何很好的理由(除非在高吞吐量情況下SQL字符串緩存)用於提取SQL字符串並直接通過JDBC自己執行它。 jOOQ主要用於渲染SQL 來執行它。

+0

感謝您將此作爲功能請求。如果我有發言權,我會強烈傾向'ResultQuery.statement(Connection con)',因爲只有這樣才能保持擁有連接,只需將它借用到JOOQ以創建語句。 – Harald 2014-10-28 11:05:31

+0

@Harald:雖然您可能更喜歡特定的API來滿足您的特定用例,但在jOOQ API的整體環境中,這將是非常令人驚訝的。在任何可比較的方法中幾乎沒有提及「連接」,因此在那裏添加它是沒有意義的。實質上,會有'ResultQuery.statement()',也許''DSLContext.statement(ResultQuery)''。這兩種方法都會與現有的['ResultQuery.keepStatement()'](http://www.jooq.org/javadoc/latest/org/jooq/ResultQuery.html#keepStatement-boolean-)行爲一致。我希望這是有道理的? – 2014-10-28 22:39:25

+0

我不確定應該添加方法調用,因爲我會如何處理此聲明?它來自我在呼叫地點並不真正擁有的聯繫,我想知道如果對這個聲明做任何事情是否明智。但是我承認,我還沒有深入到JDBC的內容。 – Harald 2014-10-30 15:53:59