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