コードジェネレーターの拡張
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>