コードジェネレーターの拡張

MyBatisコードジェネレーターは、拡張することが可能です。
以前のiBatisもできましたが、やり方が若干変わりました。
以前は、ジェネレータークラスを継承して必要なメソッドをオーバーライドする方法でしたが、
MyBatisの場合は、プラグインになっています。
プラグインクラスを継承して、必要なメソッドをオーバーライドする方法になっています。
生成するクラス名を変更してみることにします。
MyBatisのアノテーションで生成する場合は、DAOクラスは、~Mapperで、ヘルパー的なクラスは、~SqlProvider
のクラス名で、生成されますが、それを~Mapperは、~BaseDAOに、~SqlProviderは、~BaseDAOHelperに変更してみたいと思います。
MyBatisのコードジェネレーターのプラグインを作成するには、
org.mybatis.generator.api.PluginAdapterクラスを継承します。
クラス名を変えるだけなら、validateメソッドとinitializedメソッドをオーバーライドします。
名前の変更は、initializedメソッド内にロジックを書きます。
IntrospectedTableクラスのオブジェクトが引数として渡されてくるので、
そのオブジェクトが保持している内容を変更します。
getMyBatis3JavaMapperType()で、Mapperクラス名を取得できます。
getMyBatis3SqlProviderType()で、SqlProviderクラス名を取得できます。
取得したクラス名を変更して、
setMyBatis3JavaMapperType()とsetMyBatis3SqlProviderType()で、変更後のクラス名を設定できます。
実際の実装内容は、下記になります。

import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.PluginAdapter;
public class MyBatisBaseDaoClassPlugin extends PluginAdapter {
	@Override
	public boolean validate(List<String> warnings) {
		return true;
	}
	@Override
	public void initialized(IntrospectedTable introspectedTable) {
		String javaMapperType = introspectedTable.getMyBatis3JavaMapperType();
		introspectedTable.setMyBatis3JavaMapperType(replace(javaMapperType, "Mapper", "BaseDAO"));
		String sqlProviderType = introspectedTable.getMyBatis3SqlProviderType();
		introspectedTable.setMyBatis3SqlProviderType(replace(sqlProviderType, "SqlProvider", "BaseDAOHelper"));
	}
	private String replace(String target, String search, String replace) {
		Pattern pattern = Pattern.compile(search);
		Matcher matcher = pattern.matcher(target);
		target = matcher.replaceAll(replace);
		return target;
	}
}

その他に、プライマリーキー検索を行うメソッドを変更したりできます。
clientSelectByPrimaryKeyMethodGeneratedメソッドをオーバーライドすれば変更することができます。
但し、ある程度の制限があります。
デフォルトのジェネレータークラスの生成ロジック後にプラグインが呼ばれます。
引数として、Methodクラスなどのオブジェクトなどが渡されてきます。
渡されたオブジェクトの内容を変更するのですが、すべてを変更できるわけではありません。
また、独自のJavaファイルを生成することも可能です。
contextGenerateAdditionalJavaFilesメソッドをオーバーライドすれば、独自のJavaファイルを作成することができます。
作成したプラグインクラスを使うには、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="${build.lib.dir}/mysql-connector-java-5.1.16-bin.jar"/>
	<context id="MySQL" targetRuntime="MyBatis3">
		<plugin type="com.chronos.core.system.base.persistence.mybatis.plugins.MyBatisBaseDaoClassPlugin"/>
        .........
	</context>
</generatorConfiguration>