🐾

Eclipse の Maven ビルドで MyBatis Generator を実行する

2024/10/17に公開

はじめに

MyBatis Generator は、データベースのテーブル情報をもとにSQLを実行するためのコードを自動生成するものです。モデルクラス、Mapperインターフェイスクラス、そしてMapper XMLファイルなどを自動生成してくれるため、コード作成が楽になります🐤

今回は、Eclipse の Maven ビルドで MyBatis Generator を実行する方法を解説します。

前提

  • 使用するデータベースおよびテーブルは作成済み(今回は Oracle を使用しています)
  • pom.xml に MyBatis Generator ライブラリの使用が記載済み
  <build>
    <plugins>
      <plugin>
        <groupId>org.mybatis.generator</groupId>
        <artifactId>mybatis-generator-maven-plugin</artifactId>
        <version>1.3.6</version>
      </plugin>
    </plugins>
  </build>

generatorConfig.xml を作成する

generatorConfig.xml は、MyBatis Generator の設定ファイルで、プロジェクトの\src\main\resources\フォルダー配下に設置します。

下記のgeneratorConfig.xmlの例では、Oracleデータベースのテーブルからモデルとマッパーを自動生成するための構成を定義しています。

  • {プロジェクト}\src\main\resources\generatorConfig.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="${user.dir}/lib/ojdbc8.jar"/>

    <!-- コンテキストの設定 -->
    <context id="context1" targetRuntime="MyBatis3">

    <!-- プラグイン情報 -->
    <plugin type="org.mybatis.generator.plugins.SerializablePlugin" />
    <plugin type="com.example.mybatis.generator.plugins.CustomClassNamePlugin" />

    <!-- コメント生成の設定 -->
    <commentGenerator>
        <property name="suppressAllComments" value="true" />
    </commentGenerator>

    <!-- JDBC接続情報 -->
    <jdbcConnection
      driverClass="oracle.jdbc.driver.OracleDriver"
      connectionURL="${db.url}"
      userId="${db.user}"
      password="${db.password}"
    />

    <!-- 自動生成出力内容の設定 -->
    <javaModelGenerator targetPackage="com.example.model.generate" targetProject="src/main/java" />
    <sqlMapGenerator targetPackage="com.example.mapper.generate" targetProject="src/main/resources" />
    <javaClientGenerator targetPackage="com.example.mapper.generate" targetProject="src/main/java" type="XMLMAPPER" />

    <!-- 自動生成対象テーブルの設定 -->
    <table
      schema="MYSCHEMA"
      tableName="MYTABLE_AZUNYAN" 
      enableInsert="true"
      enableSelectByPrimaryKey="true"
      ... (省略)
      modelType="flat">
    </table>

  </context>
</generatorConfiguration>
AZUNYAN は我が家のハチワレ猫の名前です..😽/

各要素の解説

  1. classPathEntry
    JARファイルのパスを指定します。

  2. context
    idtargetRuntimeを指定し、コンテキストの設定を行います。

  3. plugin
    使用するプラグインを指定します。ここでは、シリアライズ可能なクラスを生成するプラグインと、カスタムで作成したプラグイン(後で補足)を設定しています。

  4. commentGenerator
    コメントの生成に関する設定。全てのコメントを出力しない設定にしています。

  5. jdbcConnection
    データベース接続の設定。ドライバクラス、接続URL、ユーザーID、パスワードを設定します。

  6. javaModelGenerator / sqlMapGenerator / javaClientGenerator
    それぞれ、モデルクラス、SQLマップファイル(Mapper XMLファイル)、そしてMapperインターフェイスクラス(クライアントインターフェース)の生成に関する設定を行います。

  7. table
    自動生成対象のテーブルに関する設定。各種操作の有効/無効設定も行えます。

Maven ビルドで MyBatis Generator を実行する方法

  1. [プロジェクト]を右クリック ⇒ [実行] ⇒ [実行の構成] ⇒ [Maven ビルド]をダブルクリック

  2. 構成を作成する。
    基底ディレクトリー:${workspace_loc:/プロジェクト名}
    ゴール:mybatis-generator:generate

  3. [実行]をクリック
    generatorConfig.xmlで指定された設定に基づいて、ファイルが生成されます。
    生成されたファイルが確認できない場合は、リフレッシュや再ビルドをお試しください🙆

2度目以降の自動生成

本設定では、1度 MyBatis Generator を実行後して対象ファイルを生成後、再度 MyBatis Generator を実行すると java ファイルは上書きされず「ファイル名.1」のように新しいファイル名で保存されるようにしています。
Eclipse のコンソールでは下記のようにメッセージが表示されます。

[WARNING] Existing file not overwritten, the generated file is saved as ・・・MyTableAzunyan.java.1

尚、xmlファイルに関しては上書きされ、設定ファイルの内容が追記されます。プロジェクトに合わせて適切なパラメータを指定してください⚠️

自動生成されるファイル

generatorConfig.xmlの定義をもとに、対象のテーブルに対応したモデルクラス、Mapperインターフェイスクラス、そしてMapper XMLファイルの3種類が生成されます。

特定のテーブル(例:MYTABLE_AZUNYAN) のコードを、先ほどのgeneratorConfig.xmlの定義をもとに自動生成した際のファイルの例をご紹介します。

  1. モデルクラス

    • ファイル名: MyTableAzunyan.java
    • 内容: データベースの MYTABLE_AZUNYAN テーブルのカラムに基づいたフィールドを持つPOJOクラスが生成されます。例えば、テーブルに id カラムや name カラムがある場合、次のようなコードになります。
    package com.example.model.generate;
    
    import java.io.Serializable;
    
    public class MyTableAzunyan implements Serializable {
        private Integer id;
        private String name;
        
        // ゲッターとセッター
        ... (省略)
    }
    
  2. Mapperインターフェイスクラス

    • ファイル名: MyTableAzunyanMapper.java
    • 内容: MYTABLE_AZUNYAN テーブルに対する操作を定義するインターフェースが生成されます。
    package com.example.mapper.generate;
    
    import com.example.model.generate.MyTableAzunyan;
    
    public interface MyTableAzunyanMapper {
        int insert(MyTableAzunyan record);
        MyTableAzunyanEntity selectByPrimaryKey(Integer id);
        // その他のメソッド(更新や削除など)
    }
    
  3. Mapper XMLファイル

    • ファイル名: MyTableAzunyanMapper.xml
    • 内容: SQL文や結果マッピングが含まれるXMLファイルが生成されます。このファイルでは、MYTABLE_AZUNYAN テーブルに対するCRUD操作が定義されます。
    <mapper namespace="com.example.mapper.generate.MyTableAzunyanMapper">
        <resultMap id="BaseResultMap" type="com.example.persistence.generate.MyTableAzunyan">
            <id column="id" property="id" />
            <result column="name" property="name" />
        </resultMap>
        <select id="selectByPrimaryKey" parameterType="map" resultMap="BaseResultMap">
            SELECT id, name FROM MYSCHEMA.MYTABLE_AZUNYAN WHERE id = #{id}
        </select>
        <!-- その他のSQL文 -->
    </mapper>
    

カスタムプラグインについて

generatorConfig.xmlでカスタムプラグインを追加していると、生成されるファイルの接尾辞を変更したり、特定のフィールドに基づいて生成物の名前を変更するなどの処理が可能です。

下記は、自動生成されるファイルの接尾辞を変更するカスタムプラグインの例になります。

package com.example.mybatis.generator.plugins;

import java.util.List;

import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.PluginAdapter;

/**
 * MyBatis Generatorで生成するクラス名を変更するプラグイン
 */
public class CustomClassNamePlugin extends PluginAdapter {

        // プラグインのバリデーション
	public boolean validate(List<String> warnings) {
		return true; 
	}

        // 初期化処理
	@Override
	public void initialized(IntrospectedTable table) {
		super.initialized(table);
        
		String name;
		// モデルのクラス名変更
		name = table.getBaseRecordType();
		table.setBaseRecordType(name + "Entity");
		// マッパーのクラス名変更
		name = table.getMyBatis3JavaMapperType();
		table.setMyBatis3JavaMapperType(name.replaceAll("Mapper$", "Dao"));
		// SQLマップファイル名の変更
		name = table.getMyBatis3XmlMapperFileName();
		table.setMyBatis3XmlMapperFileName(name.replace("Mapper.xml", "Dao.xml"));
	}
}

上記のように設定し、テーブル(例:MYTABLE_AZUNYAN)のコードを生成すると、

  • MyTableAzunyan.java →  MyTableAzunyanEntity.java
  • MyTableAzunyanMapper.java →  MyTableAzunyanDao.java
  • MyTableAzunyanMapper.xml →  MyTableAzunyanDao.xml

のようにファイルが生成されるイメージです🙆

以上、どなたかの参考になれば幸いです。
えみり〜でした|ωΦ)ฅ

参考

Discussion