可用版本:Dev (3.21) | 最新 (3.20) | 3.19 | 3.18 | 3.17 | 3.16 | 3.15 | 3.14 | 3.13 | 3.12 | 3.11

jOOQ 和 Kotlin

适用于 ✅ 开源版   ✅ 专业版   ✅ 企业版

与其他任何库一样,jOOQ 可以轻松地在 Kotlin 中使用,并利用许多 Kotlin 语言特性,例如

  • Kotlin 语句末尾的可选“;”
  • 局部变量的类型推断

一个简短的 Kotlin jOOQ 应用程序可能如下所示

package org.jooq.example.kotlin

import java.util.Properties

import org.jooq.*
import org.jooq.impl.DSL
import org.jooq.impl.DSL.*

import org.jooq.example.db.h2.Tables.*

fun main(args: Array<String>) {

    val properties = Properties();
    properties.load(Properties::class.java.getResourceAsStream("/config.properties"));

    DSL.using(
        properties.getProperty("db.url"),
        properties.getProperty("db.username"),
        properties.getProperty("db.password")
    ).use { ctx ->
        val a = AUTHOR
        val b = BOOK

        ctx.select(a.FIRST_NAME, a.LAST_NAME, b.TITLE)
           .from(a)
           .join(b).on(a.ID.eq(b.AUTHOR_ID))
           .orderBy(1, 2, 3)
           .forEach {
               println("${it[b.TITLE]} by ${it[a.FIRST_NAME]} ${it[a.LAST_NAME]}")
           }
    }
}

请注意,Kotlin 支持某些运算符重载方式。例如,Kotlin 中的 a + b 映射到正式的 a.plus(b) 方法调用,jOOQ 在其 API 中提供了所需的同义词来帮助您编写此类表达式。

一个特别好的语言特性是[方括号]允许通过 get()set() 方法访问任何对象的内容。我们可以像这样迭代,而不是使用上面的 value1()value2()value3() 方法

        ctx.select(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME, BOOK.TITLE)
           .from(AUTHOR)
           .join(BOOK).on(AUTHOR.ID.eq(BOOK.AUTHOR_ID))
           .orderBy(1, 2, 3)
           .forEach {
               println("${it[BOOK.TITLE]} by ${it[AUTHOR.FIRST_NAME]} ${it[AUTHOR.LAST_NAME]}")
               // Notice:   ^^^^^^^^^^^^         ^^^^^^^^^^^^^^^^^^^      ^^^^^^^^^^^^^^^^^^
           }

Kotlin 运算符重载的一个注意事项是,诸如 ==>= 之类的运算符分别映射到 a.equals(b)a.compareTo(b) == 0a.compareTo(b) >= 0。 这种行为在像 jOOQ 这样的流畅 API 中没有意义。

反馈

您对此页面有任何反馈吗? 我们很乐意听取您的意见!

The jOOQ Logo