6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2021-12-01

はじめに

・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

結論

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

./gradlew mybatisGenerator

・コマンド成功後のフォルダ例(自分はプロジェクト名をdddで作っていますが・・・)
スクリーンショット 2021-12-01 22.41.01.png

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

build.gradle.kts

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

<?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

6
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?