Статьи

Использование jOOQ с Groovy

Некоторые люди могут использовать 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 отображает приведенный выше код:

код jOOQ, написанный на Groovy

код jOOQ, написанный на Groovy

Интересно также отметить, что 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