Некоторые люди могут использовать jOOQ с Groovy для простого написания сценариев. Как и в случае существующей интеграции jOOQ / Scala , можно использовать некоторые возможности языка Groovy. Возьмите следующий пример, например:
package org.jooq.groovy import static org.jooq.impl.DSL.* import static org.jooq.groovy.example.h2.Tables.* import groovy.sql.Sql import org.jooq.* import org.jooq.impl.DSL sql = Sql.newInstance( 'jdbc:h2:~/scala-test', 'sa', '', 'org.h2.Driver') a = T_AUTHOR.as("a") b = T_BOOK.as("b") DSL.using(sql.connection) .select(a.FIRST_NAME, a.LAST_NAME, b.TITLE) .from(a) .join(b).on(a.ID.eq(b.AUTHOR_ID)) .fetchInto ({ r -> println( "${r.getValue(a.FIRST_NAME)} " + "${r.getValue(a.LAST_NAME)} " + "has written ${r.getValue(b.TITLE)}" ) } as RecordHandler)
Groovy не такой типичный язык. Если мы пропустим .on()
предложение в приведенном выше запросе, интеграция Eclipse IDE в Groovy будет означать, что последующий вызов fetchInto()
может не работать во время выполнения. Но Groovy не может быть уверен, так же как нельзя гарантировать, что getValue()
вызовы будут работать в интерпретации Groovy того, что такое замыкания. Вот как Eclipse отображает приведенный выше код:
Интересно также отметить, что Groovy не может определить тип интерфейса SAM (Single Abstract Method), который лучше всего соответствовал бы fetchInto()
вызову. Мы должны явно сказать Groovy принудительно закрыть JOOQ RecordHandler , и внутри этого RecordHandler мы не можем получить доступ к общеизвестному типу r
, который будет:
Record3<String, String, String>
Использование jOOQ с Groovy, безусловно, возможно, но также не так мощно, как в Scala или в Java 8.
Альтернативные способы написания SQL с помощью Groovy
Помимо использования построителя SQL-запросов, такого как jOOQ (очевидно, поскольку это блог jOOQ или его синдикация), вы также можете использовать другие способы написания SQL на Groovy. Стандартным способом является использование собственной поддержки SQL в Groovy , что намного более удобно, чем непосредственное использование JDBC. Фактически, Groovy SQL — это то, как JDBC должен был быть реализован в первую очередь:
import groovy.sql.Sql sql = Sql.newInstance( 'jdbc:h2:~/scala-test', 'sa', '', 'org.h2.Driver') sql.eachRow('select * from t_author') { println "${it.first_name} ${it.last_name}" }
Другой интересный подход заключается в использовании передовых внутренних возможностей DSL в Groovy. Вот пример Ильи Стерина, где он создал DSL для создания SQL в Groovy
Select select = sql.select ("table1") { join("table2", type: "INNER") { using(table1: "col1", table2: "col1") } join("table3", type: "OUTER") { using(table1: "col2", table2: "col2") using(table1: "col3", table2: "col3") } where("table1.col1 = 'test'") groupBy(table1: "col1", table2: "col1") orderBy(table1: "col1", table2: "col1") }
Читайте полный пост в блоге здесь:
http://ilyasterin.com/blog/2009/07/groovy-sql-builder.html