MyBatisGeneratorでテーブルをもとにEntity等を自動生成しよう

MyBatisでは、MyBatisGeneratorを使用することで、テーブルから`Entity`、`Mapper XML`、`Mapperインターフェース`などを自動生成することができます。

以下は、Spring BootのGradleプロジェクトでMyBatis Generatorを設定し、自動生成する方法の手順です。


---
### 1. 必要な依存関係を追加

まず、`build.gradle`にMyBatis Generatorのプラグインと依存関係を追加します。

```groovy:build.gradle（必要なものだけを記載）
plugins {
	id 'com.thinkimi.gradle.MybatisGenerator' version '2.4'
}

mybatisGenerator {
	verbose = true
	configFile = "src/main/resources/mybatis-generator-config.xml"
	mybatisProperties = [
			'driverFile'     : "$projectDir/src/main/libs/mysql-connector-j-9.0.0.jar",
			'jdbcUrl'        : "jdbc:mysql://db:3306/cook_diary_db",
			'jdbcDriverClass': 'com.mysql.cj.jdbc.Driver',
			'jdbcUsername'   : 'root',
			'jdbcPassword'   : 'rootpassword'
	]
}
```
---
### 2. MyBatis Generatorの設定ファイルを作成

次に、`src/main/resources`ディレクトリにMyBatis Generatorの設定ファイル`mybatis-generator-config.xml`を作成します。以下は基本的な設定例です。

```xml
<?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>
    <classPathEntry location="${driverFile}"/>
    <context id="MySQLTables" targetRuntime="MyBatis3" defaultModelType="flat">
        <!-- JDBC接続情報 -->
        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/cook_diary_db"
                        userId="root"
                        password="rootpassword"/>

        <!-- Javaのエンティティクラスの生成先 -->
        <javaModelGenerator targetPackage="com.app.cook_diary.entity"
                            targetProject="src/main/java"/>

        <!-- Mapper XMLファイルの生成先 -->
        <sqlMapGenerator targetPackage="com.app.cook_diary.mappers"
                         targetProject="src/main/resources"/>

        <!-- Mapperインターフェースの生成先 -->
        <javaClientGenerator type="XMLMAPPER"
                             targetPackage="com.app.cook_diary.mapper"
                             targetProject="src/main/java"/>

        <!-- テーブル設定 -->
        <table tableName="account" />
        <table tableName="dish" />
    </context>
</generatorConfiguration>
```

- `jdbcConnection`: Docker上のMySQLへの接続情報を設定。`connectionURL`はMySQLコンテナのアドレスとポートに対応する必要があります。
- `table`: 自動生成の対象テーブルを指定します。`tableName`はデータベースのテーブル名。domainObjectName属性を付与することで生成されるファイルのクラス名指定できる。（今回は省略）


### 注意事項
```
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"
```
上記で「``URIが未登録です``」とエラーが出ることがある。
このエラーは、XMLファイルのバリデーション時にDTDファイルを取得しようとした際にアクセスできない場合に発生します。以下の手順を実行してください。

1. <a href="http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">公式DTD URL</a>にアクセス
2. 再度エラー箇所にカーソルを合わせて「DTOを取得」を選択

⇨ これで解決するはず！

---




### 4. Gradleタスクの実行

MyBatis Generatorを実行するには、以下のコマンドを実行します。

```bash
./gradlew mybatisGenerator
```

このコマンドを実行すると、設定に基づいて、以下の3つのコンポーネントが自動生成されます。

1. **Entityクラス**（`com.example.entity`）
2. **Mapper XMLファイル**（`src/main/resources/mappers`）
3. **Mapperインターフェース**（`com.example.mapper`）

### 5. 生成されたファイルの確認

#### ・エンティティクラス

`UserEntity.java`というクラスが自動生成されます。このクラスは、テーブルのカラムに対応するフィールドを持つJavaオブジェクトです。

```java
public class UserEntity {
    private Integer id;
    private String name;
    private Integer age;

    // GetterとSetter
}
```

#### Mapper XMLファイル

`UserMapper.xml`というSQLマッパーXMLが生成され、基本的なCRUD操作が含まれます。

```xml
<mapper namespace="com.example.mapper.UserMapper">
    <resultMap id="BaseResultMap" type="com.example.entity.UserEntity">
        <id column="id" property="id" />
        <result column="name" property="name" />
        <result column="age" property="age" />
    </resultMap>

    <insert id="insert" parameterType="com.example.entity.UserEntity">
        INSERT INTO users (name, age)
        VALUES (#{name}, #{age});
    </insert>
</mapper>
```

#### Mapperインターフェース

`UserMapper.java`というインターフェースが生成されます。ここには、SQLマッパーに対応するメソッドが含まれます。

```java
public interface UserMapper {
    int insert(UserEntity record);
}
```


### まとめ

1. **依存関係の追加**: `mybatis-generator`と必要なライブラリを`build.gradle`に追加。
2. **設定ファイルの作成**: `mybatis-generator-config.xml`で接続情報と生成設定を記述。
3. **Gradleタスクの実行**: `./gradlew mybatisGenerator`でコードを自動生成。

これで、MyBatis Generatorを使ってMySQLのテーブルから自動的に`Entity`、`Mapper XML`、`Mapper`インターフェースを生成できます。

---
### 余談
#### ①実行後に起きたエラー：
```
Caused by: java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver
```

<a href="https://dev.mysql.com/downloads/connector/j/">こちら</a>にアクセスして、以下図を参考にzipをダウンロードする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1202056/74a95521-5c22-3d2d-83f1-cbca45303899.png)

build.gradleに以下を追記してjarファイルを読み込ませてあげる。
```
dependencies {
    runtimeOnly 'mysql:mysql-connector-java:8.0.33' // 最新バージョンを指定
}
```