システム開発でのmybatis-generatorの利用

システム開発における製造工程の前段では、開発メンバの負荷軽減や共通化のために、各テーブルに対するSELECT/INSERT/UPDATE/DELETEを容易に行うための共通クラスを準備することが望まれます。
ここでは、mybatis-generator(MBG)を使って、このような共通クラスを作成するための方法について説明します。(私個人的には、システム開発におけるDB操作フレームワークとしてmybatisをお薦めしていることもあって、mybatis-generatorの話をしています。)

mybatis-generatorの使い方であれば他のサイトの情報で十分だと思いますが、ここでは、実際のシステム開発ででの使用を考慮して説明します。

MBGプロジェクトの説明

  • 実際のシステム開発を想定したプロジェクト構成を前提としています。
    mavenマルチプロジェクト構成例で、mybatis-generatorを実行するためのmavenプロジェクトzzz-common-mbgを作成して、mybatis-generator(mybatis-generator-plugin)を実行する想定で説明します。
  • mybatis-generatorプラグインの実装を前提とします。
    mybatis-generatorの既定の動作では、暗号化や更新時楽観ロック等の案件固有の要件を満たせない場合があります。ここではそのような状況を想定し、mybatis-generatorが生成するクラスやファイルをカスタマイズするためのmybatis-generatorプラグイン(以後「独自プラグイン」と表記)を実装します。
  • 独自プラグインのビルドとmybatis-generator実行を同一プロジェクトに統合しています。
    mybatis-generator-pluginに独自プラグインを組み込むためには、mybatis-generator-pluginの依存関係で独自プラグインを含むパッケージ(jar)を宣言する必要があります。一般的に、独自プラグインを格納するプロジェクトを別途生成する場合がありますが、ここでは自プロジェクト内に独自プラグインを含めてmybatis-generatorを実行できるようにしています。
  • packageゴールの実行のみでmybatis-generatorを実行できるようにしています。
    本来であれば、独自プラグインをパッケージ後(packageゴール)に、mybatis-generator-pluginを実行(mybatis-generator:generateゴール)する必要がありますが、この操作は手間なので一括でできるような構成にしています。

構成内容

独自プラグインやmybatis-generatorの動作を決定するためにpom.xml、mybatis-generatorの構成ファイルとなるgeneratorConfig.xmlについて説明します。
(それぞれ説明が長くなるので先にサンプルを提示して説明します。)

pom.xml

  • pom.xmlや後述のgeneratorConfig.xmlで共通の定数(プロパティ)を使用するためにproperties要素でzzz.mbg.basedirを定義しています。
  • 独自プラグインのビルドのためにdependencies要素で、mybatis-generator-core, org.apache.commons, org.slf4jを宣言しています。commonsとslf4jのバージョン宣言ですが、システム全体で使用するので親プロジェクトzzz-parentで宣言しています。
  • pluginsのplugin要素でmybatis-generator-pluginを定義します。mybatis-generatorに関する設定は、基本的にこの要素内で行います。指定可能な要素は、mybatis-generatorのリファレンスを参照のこと。
  • configuration要素内では次の設定を行います。
    • configurationFile要素で、使用するmybatis-generator設定ファイルを指定します。
      サブシステム毎に独立してmybatis-generator設定を管理する想定であり、実行前に対象サブシステムの設定ファイルの宣言を有効化する必要があります。
    • overwrite要素で、上書きオプションを有効化します。
      既定でmybatis-generatorは既存ファイルがあると”*.java.2″, “*.java.3″等の名前でファイルを作成します。この動作を回避するために本設定を有効にします。ただし、この設定だけではファイル作成時にマージ(変更箇所が追加)されてしまうので、mybatis-generatorのUnmergeableXmlMappersPluginを有効化します。
  • generatorConfig.xml(classPathEntry要素)でJDBCドライバの指定を行うこともできますが、パッケージ(jar)管理は可能な限りmavenで行う想定であるため、dependencies要素でJDBCドライバ(mariadb-java-client)を宣言しています。
  • mybatis-generator-pluginの依存関係として独自プラグイン(jar)を参照するためには、通常はリポジトリへのインストール(maven install)が必要です。独自プラグインは、mybatis-generatorの実行にしか使わないため、リポジトリへのインストールは行わず、relativePath要素で直接参照しています。
  • mavenのpackageゴールでmybatis-generatorを実行できるよう、execution要素にて、packageゴール時にgenerateゴールを実行するよう宣言しています。

generatorConfig.xml

  • 構成ファイルの詳細については、mybatis-generatorのマニュアルを参照のこと。なお、DTDで定義されている順番で定義しないとXMLバリデーションエラーになるので注意。
  • mybatis-generatorが出力するクラスやクエリ(XML)をカスタマイズできるよう、従来のモデル/マッパークラス/マッパーXMLファイルを使用します。(context要素のtargetRuntime属性にMyBatis3を指定)
  • plugin要素で、mybatis-generatorで提供されるプラグインや独自プラグインを指定します。独自プラグインについては、別途説明記事を追加予定です。
  • XMLマッパーファイルにXMLコメントが出力されると独自プラグインの実装(コメント除外)が複雑になるため、commentGenerator要素でコメント出力を抑制します。
  • javaModelGenerator, sqlMapGenerator, javaClientGenerator要素で参照している${zzz.mbg.basedir}は前述のpom.xmlで定義しています。
  • 上記のAddBaseEntityPluginプラグインで、各モデルに対してシステム共通のEntityを継承できるよう、table要素のmodelType属性でflatを指定しています。(flat以外だとmybatis-generatorが自動生成したPKクラスが継承される場合があるため。)