【Kotlin】Gradle Kotlin DSLでjOOQを導入する

2020年9月15日

Kotlinで作成しているプロジェクトにjOOQを導入する方法です。

フレームワークはSpringBootを使用、ビルドはGradle Kotlin DSLで記載しています。kotlin-dsl-jOOQのREADMEに記載されている方法ではエラーが出たりしていましたので、同様にエラーが出た場合はここに記載の記述にするとよいと思います。

環境情報

SpringBoot: version 2.3
Kotlin: version 1.3
kotlin-dsl-jOOQ: version 0.4.6
JDK: Amazon Coretto 11
MySQL: version 5.7

jOOQとは

jOOQはJava・Kotlinで使用できるORMライブラリです。同じORMとしてはhibernateもありますが、hibernateに比べると記載がSQLに近く、また挙動が素直なのが良いところかと思います。(hibernateはキャッシュやらでごちゃごちゃしている…)

jOOQは既存のデータベースからモデルを自動生成することもできるのも良いところ。

Gradle Kotlin DSLでjOOQを導入する

build.gradle.ktsに以下のような記載を追記します。DBはMySQLを使用しています。

import com.rohanprabhu.gradle.plugins.kdjooq.*

plugins {
	id("com.rohanprabhu.kotlin-dsl-jooq") version "0.4.6"
}

dependencies {
	implementation("org.springframework.boot:spring-boot-starter-jooq")
	implementation("mysql:mysql-connector-java")
	jooqGeneratorRuntime("mysql:mysql-connector-java")
}

jooqGenerator {
	configuration("primary", project.the<SourceSetContainer>()["main"]) {
		configuration = jooqCodegenConfiguration {
			jdbc {
				username = "sample_master" // DBのユーザ名
				password = "sample_master" // DBのパスワード
				driver   = "com.mysql.jdbc.Driver" // 使用するDBドライバー
				url      = "jdbc:mysql://localhost:3306/sample_schema?serverTimezone=JST" // DBの接続先
			}

			generator {
				target {
					packageName = "com.sample.jooq.generated" // 自動生成するソースのパッケージを指定
					directory   = "${project.rootDir}/src/main/kotlin" // 自動生成するソースの配置先ディレクトリを指定
				}

				database {
					name = "org.jooq.meta.mysql.MySQLDatabase"
					inputSchema = "sample_schema" // 対象のスキーマ名を指定
				}
			}
		}
	}
}

上では以下のような設定のDBへ接続しています。

対象スキーマ:sample_schema
DBユーザ:sample_master
DBパスワード:sample_master

ちなみに

kotlin-dsl-jooq-pluginのgithubで記載されていた記載ではエラーが出たので、以下のように記載することで上手くいきました。

// ここの記載はエラーとなった
jooqGenerator {
	configuration("primary", project.java.sourcesets.getByName("main")) {
// 省略
}

// こちらが正しい
jooqGenerator {
	configuration("primary", project.the<SourceSetContainer>()["main"]) {
// 省略
}

ちなみに、起きていたエラーは「Unresolved reference: sourcesets」でした。sourcesetsが見つからないってことですね。原因は良く分かりません。

ソースを自動生成する

Gradleタスクのjooq-coodegenが追加されているのでこちらを実行すると現在のテーブル情報を元にソースコードを自動生成してくれます。

 

これでコーディングが始められる!!

 

<2020年7月27日追記>

SpringBootで生成したモデルを使用するために必要な設定を記載し忘れていました・・・。申し訳ありません。

resources/application.ymlに以下の記載を追記してください。

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/sample_schema?serverTimezone=JST&useUnicode=true&characterEncoding=utf8
    username: sample_master
    password: sample_master

これでアプリケーションが起動できるはずです。

参考

https://github.com/rohanprabhu/kotlin-dsl-gradle-jooq-plugin

https://stackoverflow.com/questions/52975515/unresolved-reference-sourcesets-for-gradle-kotlin-dsl