Spring Boot + Kotlin + MySQL8 + Mybatis + MybatisGenerator @ IntellijIDEA(community) でMybatisGeneratorに動いてもらう

# はじめに
・PHP + Laravelが普段使いだけどSpring + java8 + Mybatis案件で機能追加開発に携わって、Mybatis気に入った。
・DDD勉強中だし、Kotlinでやりたい。
・いざ導入。
・MybatisGeneratorをbuild.gradle.ktsで書くにはどうする？となっても一発で良いのが出ない。

ということで動かしたので備忘録として残します。

# 前提
・Apple M1
・openjdk version "1.8.0_302"
・IntellijIDEAを利用している
・MySQL8系　がローカルにインストール済み
・Spring Initializerで作成 https://start.spring.io/
![スクリーンショット 2021-12-01 22.12.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439203/f7b360e3-9323-0f12-e98c-16c65942ee86.png)

# 結論

対象ファイル
・build.gradle.kts　にmybatisgeneratorを実行するタスクを追加する
・src/main/resources/generatorConfig.ymlを用意する
・最後にプロジェクト直下で

```
./gradlew mybatisGenerator
```

・コマンド成功後のフォルダ例（自分はプロジェクト名をdddで作っていますが・・・）
![スクリーンショット 2021-12-01 22.41.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439203/fa8a2cc6-c391-83eb-bf97-7f42bd415122.png)


# 記述内容（コメントアウトで簡単な説明をしてます）

build.gradle.kts

```gradle
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
	id("org.springframework.boot") version "2.6.1"
	id("io.spring.dependency-management") version "1.0.11.RELEASE"
	kotlin("jvm") version "1.6.0"
	kotlin("plugin.spring") version "1.6.0"
}

group = "com.example"
version = "0.0.1-SNAPSHOT"
java.sourceCompatibility = JavaVersion.VERSION_1_8

configurations {
	compileOnly {
		extendsFrom(configurations.annotationProcessor.get())
	}
}

repositories {
	mavenCentral()
}

dependencies {
	implementation("org.springframework.boot:spring-boot-starter-webflux")
	implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
	implementation("io.projectreactor.kotlin:reactor-kotlin-extensions")
	implementation("org.jetbrains.kotlin:kotlin-reflect")
	implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
	implementation("org.jetbrains.kotlinx:kotlinx-coroutines-reactor")
	implementation("org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.0")
	// https://mvnrepository.com/artifact/mysql/mysql-connector-java
	implementation("mysql:mysql-connector-java:8.0.22")
	compileOnly("org.projectlombok:lombok")
	annotationProcessor("org.projectlombok:lombok")
	testImplementation("org.springframework.boot:spring-boot-starter-test")
	testImplementation("io.projectreactor:reactor-test")
}

tasks.withType<KotlinCompile> {
	kotlinOptions {
		freeCompilerArgs = listOf("-Xjsr305=strict")
		jvmTarget = "1.8"
	}
}

tasks.withType<Test> {
	useJUnitPlatform()
}

/** -----------------------------------------------------
 * 　ここ以降が肝です。　Mybatis Generator 実行タスク　
 * -----------------------------------------------------*/
val mybatisMapperVersion = "4.1.5"
val mybatisGeneratorVersion = "1.4.0"
val mysqlConnectorJavaVersion = "8.0.22"

val mybatisGenerator by configurations.creating

dependencies {
	mybatisGenerator(group="org.mybatis.generator", name="mybatis-generator-core", version=mybatisGeneratorVersion)
	mybatisGenerator(group="mysql", name="mysql-connector-java", version=mysqlConnectorJavaVersion)
	mybatisGenerator(group="tk.mybatis", name="mapper", version=mybatisMapperVersion)
}
task("mybatisGenerator") {
	doLast {
		ant.withGroovyBuilder {
			"taskdef"("name" to "mbgenerator", "classname" to "org.mybatis.generator.ant.GeneratorAntTask", "classpath" to mybatisGenerator.asPath)
		}
		ant.withGroovyBuilder {
			"mbgenerator"("overwrite" to true, "configfile" to 
/*
自分はフルパスでやりました。
/Users/hogehoge/・・・/demo/src/main/resources/generatorConfig.yml
要は、generatorConfig.ymlまでのフルパスを指定すれば大丈夫です。
なので、例えば、
resources/mybatis/config/generatorConfig.yml
に作成しても大丈夫です。
*/
"path/to/main/resources/generatorConfig.xml", "verbose" to true)
		}
	}
}
```

generatorConfig.yml

```php
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD
  MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" >
<generatorConfiguration>
    <!-- mysql-connectorの場所は例えば、.gradle/caches/modules-2/files-2.1/mysql/mysql-connector-java/~ にある。とにかくjarファイルを見つける。 -->
    <classPathEntry
            location="path/to/.gradle/caches/modules-2/files-2.1/mysql/mysql-connector-java/8.0.22/長い文字列/mysql-connector-java-8.0.22.jar"/>
    <context id="MySQLTables" targetRuntime="MyBatis3Kotlin">
        <plugin type="org.mybatis.generator.plugins.MapperAnnotationPlugin"/>
        <commentGenerator>
            <property name="suppressDate" value="true"/>
        </commentGenerator>
        <jdbcConnection
                driverClass="com.mysql.cj.jdbc.Driver"
                connectionURL="jdbc:mysql://localhost:3306/対象のDB名"
                userId="対象のMySQLユーザー名"
                password="対象のMySQLパスワード">
            <property name="nullCatalogMeansCurrent" value="true"/>
        </jdbcConnection>
        <!-- src/main/kotlin/com.example.対象プロジェクト名.infrastructure　など、任意のパッケージを src/main/kotlin/に作成し指定する。 -->
        <javaModelGenerator
                targetPackage="com.example.対象プロジェクト名.infrastructure"
                targetProject="src/main/kotlin">
        </javaModelGenerator>
        <javaClientGenerator
                targetPackage="com.example.対象プロジェクト名.infrastructure"
                targetProject="src/main/kotlin">
        </javaClientGenerator>
        <table tableName="%"/>
    </context>
</generatorConfiguration>
```

# その他注意点
・PlayFramework + ScalikeJDBC でMySQL8に接続した時、JDBCドライバーがMySQLバージョンにあってないと怒られたことがあります。その経験から、generatorConfig.ymlで利用するドライバーは

```
com.mysql.cj.jdbc.Driver
```
にしています。

# 最後に

なんでおめえJava17じゃねえんだよ・・・・となった方、ごめんなさい。
とにかくいま、僕はDDDの練習がしたいのです。

すいません。終わります。

あれ・・・・？Generatorいる・・・？

#参考にした記事

これが大先生です。
https://cwlab.hatenablog.jp/entry/2019/12/18/233216

こちらはKotlin始めるとき買った書籍の著者さんが公開しているGithubです。
https://github.com/n-takehata/kotlin-server-side-programming-practice/tree/main/part2/chapter05