MyBatisGeneratorをいじくる

Java

久々の更新です(笑)
今度はちゃんと技術ネタを書きたいと思います。

今回はMyBatisを取り上げてみます。
MyBatisはSQL文ベースで管理できるJavaのORMフレームワークで、カスタマイズがしやすく特殊なテーブル構成だったり、クエリレベルのパフォーマンスを気にする方などにおすすめです。

細かい実装方法などはWEB上を日本語マニュアルを読めばだいたいわかるので、
MyBatisで開発する際に欠かせないコードジェネレーターをカスタマイズしてみたいと思います。

ちなみに、MyBatisは昔はiBatisという名前だったのでご存知の方もいるかと思います。
iBatis2系が3にバージョンアップした時にMyBatisと名前変え、
おまけにパッケージ構造等もガラリと変わってしまったので
2系をカスタマイズして使ってた人はうげーとなって未だにiBatis2を使ってるプロジェクトなんかもあったりします(笑)

さてまずは、MyBatisのコードジェネレーターの取得です。
mybatis-generator-coreのJarファイルをMavenレポジトリから取得します。

<dependency>
    <groupId>org.mybatis.generator</groupId>
    <artifactId>mybatis-generator</artifactId>
    <version>1.3.2</version>
</dependency>

設定はXMLで行います。
以下のようなXMLファイルを作成して、ジェネレート実行時に指定します。

この例ではライブラリ添付のプラグインを使って、SQLマップファイル群を読み込む設定ファイルも生成しています。

<generatorConfiguration>
    <context id="context1" targetRuntime="MyBatis3">
        <plugin type="org.mybatis.generator.plugins.MapperConfigPlugin">
            <property name="targetPackage" value="config.dao.mybatis.sqlmap" />
            <property name="targetProject" value="gen_src/conf" />
        </plugin>
        <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8" userId="root" password="admin" />
        <javaModelGenerator targetPackage="jp.laziness.data.entity" targetProject="gen_src/java" />
        <sqlMapGenerator targetPackage="config.dao.mybatis.sqlmap" targetProject="gen_src/conf" />
        <javaClientGenerator targetPackage="jp.laziness.data.dao" targetProject="gen_src/java" type="XMLMAPPER" />
        <table schema="test" tableName="%" />
    </context>
</generatorConfiguration>

eclipse上で開発する場合はAntで実行するのが楽なので、以下のようなbuild.xmlを作成して実行します。

<?xml version="1.0" encoding="utf-8"?>
<project default="genfiles" basedir=".">
    <property name="generated.source.dir" value="${basedir}" />
    <path id="class.path">
        <fileset dir="../lib/jars" includes="*.jar" />
        <dirset dir="../bin" />
    </path>
    <target name="genfiles" description="Generate the files">
        <taskdef name="mbgenerator" classname="org.mybatis.generator.ant.GeneratorAntTask" classpathref="class.path" />
        <mbgenerator overwrite="true" configfile="generatorConfig.xml" verbose="false" />
    </target>
</project>

なおMybatisのジェネレーターのカスタマイズはプラグイン形式で行うことができます。
org.mybatis.generator.api.PluginAdapterというクラスを継承して独自クラスを実装し、設定ファイルに追加するだけで生成するものをカスタマイズしていくことができます。

試しに作成されるDAOアクセスクラス名をデフォルトの”テーブル名+Mapper”から”テーブル名+Dao”に変更するサンプルです。

public class MapperToDaoPlugin extends PluginAdapter {
    @Override
    public boolean validate(List<String> paramList) {
        return true;
    }
    @Override
    public void initialized(IntrospectedTable introspectedTable) {
        super.initialized(introspectedTable);
        // Mapper -> Dao
        String name = introspectedTable.getMyBatis3JavaMapperType();
        introspectedTable.setMyBatis3JavaMapperType(name.replaceAll("Mapper", "Dao"));
    }
}

内部的には各生成処理内部でプラグインが呼ばれるので、そこでクラス名を正規表現で書き換えてるだけです。

iBatisのAbatorの頃は、生成メソッド自体をオーバーライドして独自実装って感じだったのですが、このプラグイン形式になったおかげでだいぶカスタマイズしやすくなりました。
org.mybatis.generator.plugins以下にライブラリ側で提供してるプラグインもあるので、そいつを参考にすると色々できると思います。

MySQLの「limit,offset」対応や整数値をインクリメントするUPDATE文対応など、いろいろできるので次回も紹介していこうと思います。

コメント

タイトルとURLをコピーしました