GradleでJOOQを使ってみた

# GradleでJOOQを使ってみた
注意：この記事は IntelliJ Community (無料版) の Tomcat (JavaEE) 内で [JOOQ](https://mvnrepository.com/artifact/org.jooq) を利用した時の備忘録です。
IntelliJでGradleを利用したtomcatの環境構築は、以下のリンクで解説しています。
[IntelliJ Community で Tomcat の実行環境を整備する](https://qiita.com/Kakky/items/27fa8940016428ee71f6)
iciqlでON DUPLICATE KEY UPDATEが利用できないっぽかった(コード生成も失敗した)ので移行しました。

また、環境はWindows10を想定しています。

## 外部ライブラリにjooqを追加
build.gradle の dependencies に以下を追記します。

```groovy
dependencies {
    //データベースのコネクターを追加
    //(mysqlの場合は6以上のバージョンを指定するとTimeZone関連のエラーが出る)
    compile group: 'mysql', name: 'mysql-connector-java', version: '5.1.47'

    //jooq関連のjarを追加
    compile group: 'org.jooq', name: 'jooq', version: '3.11.2'
    compile group: 'org.jooq', name: 'jooq-parent', version: '3.11.2'/*, ext: 'pom'*/
    compile group: 'org.jooq', name: 'jooq-meta', version: '3.11.2'
    compile group: 'org.jooq', name: 'jooq-meta-extensions', version: '3.11.2'
    compile group: 'org.jooq', name: 'jooq-codegen', version: '3.11.2'
    compile group: 'org.jooq', name: 'jooq-codegen-maven', version: '3.11.2'
}
```

データベースのコネクタも一緒に追加する必要があるのですが、MySQLをお使いの場合、 version を6.0 以上を指定すると実行時に以下の様なエラーが出ます。

```The server time zone value '???? (?W????)' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specific time zone value if you want to utilize time zone support.```

## JOOQでコードを生成するのに便利なプラグインを入れる
[JOOQ プラグイン](https://plugins.gradle.org/plugin/nu.studer.jooq)を導入するために、 build.gradle の plugins を追記します。

```groovy
plugins {
    id 'nu.studer.jooq' version '3.0.2'
}
```

## JOOQプラグインの設定をする
JOOQプラグインの設定は、build.gradle 内にjooq{} を宣言し、その内部に書き込むことでできます。

```groovy

dependencies {
    jooqRuntime group: 'mysql', name: 'mysql-connector-java', version: '5.1.47'
}

jooq {
    //jooqのバージョンを指定
    version = '3.11.2'
    edition = 'OSS'
    tables(sourceSets.main) {
        jdbc {
            //データベースドライバの完全修飾クラス名
            driver = 'com.mysql.jdbc.Driver'
            //SQLに接続するためのURL
            url = 'jdbc:mysql://localhost:3306/Hoge?serverTimezone=JST'
            //データベースにログインするためのユーザ名
            user = 'user'
            //データベースにログインするためのパスワード
            password = 'password'
        }
        generator {
            name = 'org.jooq.codegen.DefaultGenerator'
            database {
                //対象とするデータベースを表すクラス名(後述)
                name = 'org.jooq.meta.mysql.MySQLDatabase'
                inputSchema = ''
                includes = '.*'
                excludes = ''
            }
            target {
                //生成されるコードのパッケージ名
                packageName = 'jooq'
                //生成されるコードを配置するディレクトリ
                directory = 'src/main/java'
            }
        }
    }
}
```

データベースでMySQL以外を利用したい場合は、以下の表の通りにnameを指定してください。
データベース接続に使うjooqのクラス名です。

|データベース|name|
|---|---|
|ase|org.jooq.util.ase.ASEDatabase|
|cubrid|org.jooq.util.cubrid.CUBRIDDatabase|
|db2|org.jooq.util.db2.DB2Database|
|derby|org.jooq.util.derby.DerbyDatabase|
|h2|org.jooq.util.h2.H2Database|
|hsqldb|org.jooq.util.hsqldb.HSQLDBDatabase|
|ingres|org.jooq.util.ingres.IngresDatabase|
|mysql|org.jooq.util.mysql.MySQLDatabase|
|oracle|org.jooq.util.oracle.OracleDatabase|
|postgres|org.jooq.util.postgres.PostgresDatabase|
|sqlite|org.jooq.util.sqlite.SQLiteDatabase|
|sqlserver|org.jooq.util.sqlserver.SQLServerDatabase|
|sybe|org.jooq.util.sybase.SybaseDatabase|

・[jooq Code generation | Java開発](http://java.thick.jp/javaopensource%E3%81%AE%E7%B4%B9%E4%BB%8B/db/jooq/jooq-code-generation/)

## JOOQのコード生成
Gradleウィンドウにjooq → generateTablesJooqSchemaSource というTaskがあるので、それを実行することでデータベースからそれに対応したクラスを自動生成することが出来ます。

## JOOQでLet's Programming!

・[jOOQ使用方法のまとめ](https://qiita.com/rubytomato@github/items/93ed18b30605f4491086)