プラグイン拡張

MySQLには安全等価演算子(<=>)があるので、それを使えるようにMyBatis Generatorを拡張する。

config.xmlに以下のようにpluginを追加すれば自動的にメソッドが追加される。

package jp.co.hoge.fuga; import static org.mybatis.generator.internal.util.StringUtility.stringHasValue; import java.util.List; import org.mybatis.generator.api.IntrospectedColumn; import org.mybatis.generator.api.IntrospectedTable; import org.mybatis.generator.api.PluginAdapter; import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType; import org.mybatis.generator.api.dom.java.InnerClass; import org.mybatis.generator.api.dom.java.JavaVisibility; import org.mybatis.generator.api.dom.java.Method; import org.mybatis.generator.api.dom.java.Parameter; import org.mybatis.generator.api.dom.java.TopLevelClass; import org.mybatis.generator.codegen.mybatis3.MyBatis3FormattingUtilities; public class ExampleExpansionPlugin extends PluginAdapter { @Override public boolean validate(List<String> warnings) { return true; } @Override public boolean modelExampleClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) { for (InnerClass answer : topLevelClass.getInnerClasses()) { if (answer.getType().equals(FullyQualifiedJavaType.getGeneratedCriteriaInstance())) { for (IntrospectedColumn introspectedColumn : introspectedTable.getAllColumns()) { answer.addMethod(getSetEqualSafetyMethod(introspectedColumn)); } break; } } return true; } private Method getSetEqualSafetyMethod(IntrospectedColumn introspectedColumn) { return getSingleValueMethod(introspectedColumn, "SafeEqualTo", "<=>"); } private Method getSingleValueMethod(IntrospectedColumn introspectedColumn, String nameFragment, String operator) { Method method = new Method(); method.setVisibility(JavaVisibility.PUBLIC); method.addParameter(new Parameter(introspectedColumn.getFullyQualifiedJavaType(), "value")); StringBuilder sb = new StringBuilder(); sb.append(introspectedColumn.getJavaProperty()); sb.setCharAt(0, Character.toUpperCase(sb.charAt(0))); sb.insert(0, "and"); sb.append(nameFragment); method.setName(sb.toString()); method.setReturnType(FullyQualifiedJavaType.getCriteriaInstance()); sb.setLength(0); if (introspectedColumn.isJDBCDateColumn()) { sb.append("addCriterionForJDBCDate(\""); } else if (introspectedColumn.isJDBCTimeColumn()) { sb.append("addCriterionForJDBCTime(\""); } else if (stringHasValue(introspectedColumn.getTypeHandler())) { sb.append("add"); sb.append(introspectedColumn.getJavaProperty()); sb.setCharAt(3, Character.toUpperCase(sb.charAt(3))); sb.append("Criterion(\""); } else { sb.append("addCriterion(\""); } sb.append(MyBatis3FormattingUtilities.getAliasedActualColumnName(introspectedColumn)); sb.append(' '); sb.append(operator); sb.append("\", "); if (introspectedColumn.getFullyQualifiedJavaType().isPrimitive()) { sb.append("new "); sb.append(introspectedColumn.getFullyQualifiedJavaType().getPrimitiveTypeWrapper().getShortName()); sb.append("(value)"); } else { sb.append("value"); } sb.append(", \""); sb.append(introspectedColumn.getJavaProperty()); sb.append("\");"); method.addBodyLine(sb.toString()); method.addBodyLine("return (Criteria) this;"); return method; } }

<?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.17-bin.jar" /> <context id="MySQL" targetRuntime="MyBatis3"> <plugin type="jp.co.hoge.fuga.ExampleExpansionPlugin"/> <commentGenerator> <property name="suppressDate" value="true"/> </commentGenerator> <jdbcConnection driverClass="${dbconnection.driver}" connectionURL="${dbconnection.url}"

userId="${dbconnection.username}" password="${dbconnection.password}"> </jdbcConnection> <javaTypeResolver /> <javaModelGenerator targetPackage="${persistence.package}.base.entity" targetProject="${gen.src.dir}"> <property name="enableSubPackages" value="true" /> <property name="trimStrings" value="true" /> </javaModelGenerator> <javaClientGenerator type="ANNOTATEDMAPPER" targetPackage="${persistence.package}.base.dao" targetProject="${gen.src.dir}"> <property name="enableSubPackages" value="true" /> </javaClientGenerator> <table tableName="table_a" /> </context> </generatorConfiguration>