MyBatisGeneratorを用いて、Model・Mapperの作成

## 1.目的
　SpringBootのAPIを作成時に、Mybatisを用いて、DBより取得をするにあたって、ModelとMapperを作成する必要があり、ありきたりなやり方ですが、MyBatisGeneratorを用いて、自動生成するやり方を残します。

## 2.環境
　　　eclipse（Version: 2022-12 (4.26.0))
　　　java（ver.17) 
　　　spring boot 3.1.1
　　　Gradle - Groovy
　　　mysql（Ver 8.0.33）

## 3.事前準備
### (1)　DBを準備する。
※今回はMysql（mysql  Ver 8.0.33 for macos10.15 on x86_64 (Homebrew)）を事前にインストールして、使用する。

```
Last login: Sun Aug  6 12:02:12 on ttys000
xxxxx> mysql --version
mysql  Ver 8.0.33 for macos10.15 on x86_64 (Homebrew)
```




### (2)　DB内にスキーマを作成して、テーブルを用意する。
※テーブルの内容は問わない。テーブルの中に定義があれば良い。
（mysqlで作成後、DB操作のツールでアクセスして、テーブルを作成済み）

![スクリーンショット 2023-08-06 13.40.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583781/29b0aed2-fa38-e280-49c9-daeebb35ad95.png)

### (3)　対象のSpring Bootのプロジェクトを作成する。
① Eclipseで、ファイル→新規→Spring スタータープロジェクトで選択し、設定は標準で作成する。（プロジェクト名は設定必要）
![スクリーンショット 2023-08-06 13.50.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583781/791e9c7d-600b-d14e-e7a4-37a638fb6907.png)


② ①の後に、以下のようにプロジェクトが作成されれば問題なし。
![スクリーンショット 2023-08-06 13.54.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583781/c6ff1e95-9e3a-e442-184c-8da7fcdac1b2.png)

③ ヘルプ→Eclipseマーケットプレイスを選択する。
![スクリーンショット 2023-08-06 13.55.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583781/bc6af7c6-391c-66d2-7777-8d698df2ded3.png)

④ MyBatisGeneratorの最新版をインストールする。（画像は既にインストール済みの場合）
![スクリーンショット 2023-08-06 12.59.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583781/6f2722d2-8595-5b8c-a2c5-cf1ff3a3b37c.png)

⑤ 「build.gradle」の内容を設定。
（以下、今回、事前検証で成功したものを掲載）
```java:build.gradle
plugins {
	id 'java'
	id 'org.springframework.boot' version '3.1.2'
	id 'io.spring.dependency-management' version '1.1.2'
}

group = 'com'
version = '0.0.1-SNAPSHOT'

java {
	sourceCompatibility = '17'
}

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}
repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
	// 依存性を追加
	implementation 'org.openapitools:jackson-databind-nullable:0.2.1'
	implementation 'org.springframework.boot:spring-boot-starter-validation'
	implementation group: 'org.springdoc', name: 'springdoc-openapi-ui', version: '1.6.9'
	implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.3.0'
	runtimeOnly 'com.mysql:mysql-connector-j'
}

tasks.named('test') {
	useJUnitPlatform()
}
```
## 4.作成時
① 「mybatis-generator-config.xml」を追加する。
（※そのまま流用して、内容をこの後編集すれば良い。）

```java:mybatis-generator-config.xml
<!DOCTYPE generatorConfiguration 
  PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
  "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
     
<generatorConfiguration>
  <context id="demoTables" targetRuntime="MyBatis3">
    <!-- DB接続設定 -->
     <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
      connectionURL="jdbc:mysql://localhost/【スキーマ名】"
      userId="【スキーマのユーザID】"
      password="【スキーマのパスワード】"
      <property name="nullCatalogMeansCurrent" value="true" />
    </jdbcConnection>

 
    <!-- Select結果がマッピングされる、Javaモデルの出力設定 -->
    <javaModelGenerator targetPackage="【作成する任意パス】1" targetProject="mybatisTest/src/main/java">
      <property name="enableSubPackages" value="true" />
      <property name="trimStrings" value="true" />
    </javaModelGenerator>
      

    <!-- SQLを定義したXMLファイルの出力設定 -->
    <sqlMapGenerator targetPackage="【作成する任意パス】2" targetProject="mybatisTest/src/main/resources">
      <property name="enableSubPackages" value="true" />
    </sqlMapGenerator>
    
    <!-- Mapperインターフェースの出力設定 -->
    <javaClientGenerator type="XMLMAPPER" targetPackage="【作成する任意パス】3" targetProject="mybatisTest/src/main/java"> 
      <property name="enableSubPackages" value="true" />
    </javaClientGenerator>
    
    <!-- 自動生成するテーブルの設定 -->
    <!-- ここを設定することでCRUDのつくりを操作できる -->
    <table tableName="%"
      enableInsert="true"
      enableSelectByPrimaryKey="true"
      enableUpdateByPrimaryKey="true"
      enableDeleteByPrimaryKey="true"
      enableSelectByExample="true"
      enableUpdateByExample="true"
      enableDeleteByExample="true"
      enableCountByExample="true"
      selectByPrimaryKeyQueryId="true"
      selectByExampleQueryId="true"
      modelType="flat">
    </table>
  </context>
</generatorConfiguration>
```

② 内容を修正
　・DB情報
　・【作成する任意パス】1 〜　【作成する任意パス】3
→DB接続して、取得した内容でModelとMapperを作成できるように設定。

※修正後のイメージ
![スクリーンショット 2023-08-06 14.28.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583781/52f05daf-ebb0-5c2f-8b15-7745a8d9a0fc.png)

③「mybatis-generator-config.xml」を右クリックして、実行→ 1 Run MyBatis Generatorをクリックする。（表示されない場合は、実行の構成より、設定をする）
![スクリーンショット 2023-08-06 14.30.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583781/06d21ee2-86dc-e4d0-9c93-e9c3db6986b0.png)

④実行後にコンソールに、以下のように表示されたら、MyBatisGeneratorの実行が成功である。

```java:console
MyBatis Generator Started...
  ビルドファイル: /Users/xxxxx/Documents/GitHub/.metadata/.plugins/org.mybatis.generator.eclipse.ui/.generatedAntScripts/mybatisTest-mybatis-generator-config.xml.xml
  ビルド成功
MyBatis Generator Finished
```

## 4.実行結果


※作成された階層の確認。


### ① Mapperの確認
→ 「mybatis-generator-config.xml」にて
　『SQLを定義したXMLファイルの出力設定』で指定した階層を確認
※例はテーブル「M_TALENT」に紐づく、Mapperファイル
![スクリーンショット 2023-08-06 14.39.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583781/fae23882-aeb4-f0b5-a023-19f8760bb507.png)

→ 「mybatis-generator-config.xml」にて
　『Mapperインターフェースの出力設定』で指定した階層を確認
 ※例はテーブル「M_TALENT」に紐づく、Mapperのインタフェース
![スクリーンショット 2023-08-06 14.43.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583781/9a1ad3fb-c525-21bc-b442-eacf2c4f2cff.png)

### ② Modelの確認
→ 「mybatis-generator-config.xml」にて
　『Select結果がマッピングされる、Javaモデルの出力設定』で指定した階層を確認
※例はテーブル「M_TALENT」に紐づく、Modelファイル
![スクリーンショット 2023-08-06 14.44.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583781/e780b995-b1c4-106a-e5ca-70a219ae8d66.png)


## 5.まとめ

ここで実装をしたものを継承することでmybatisを用いた開発を楽にすることができます。
使用方法はここでは割愛しますが、作成したものを階層を変更したり、少しいじることで、
無事mybatisで取得した結果をModelへ格納までできました。
その際にMapStructを用いるのでまた次回はmapStructの記事を書きます。