声明:本文感谢satellite同学。
====================================
先看Generator,另外generator启动方式还有命令行 和 ant 方式等。
package mybatis.generator; import java.io.File; import java.util.ArrayList; import java.util.List; import org.mybatis.generator.api.MyBatisGenerator; import org.mybatis.generator.config.Configuration; import org.mybatis.generator.config.xml.ConfigurationParser; import org.mybatis.generator.internal.DefaultShellCallback; public class Generator { public static void main(String[] args) { List<String> warnings = new ArrayList<String>(); ConfigurationParser cp = new ConfigurationParser(warnings); boolean overwrite = true; //staticTableConfig.xml,dynamicTableConfig.xml File configFile = new File( "E:/javaspace/svnspace/WCM5.0/PublishServer/tools/generator/dynamicTableConfig.xml"); try { Configuration config = cp.parseConfiguration(configFile); DefaultShellCallback callback = new DefaultShellCallback(overwrite); MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings); myBatisGenerator.generate(null); } catch (Exception e) { e.printStackTrace(); } } }
接下来看Plugin,Plugin用于生成的Java代码改造 和 生成的sql改造,具体请参见Mybatis 文档。
参考链接:
http://www.mybatis.org/
http://www.mybatis.org/java.html
http://code.google.com/p/mybatis
package mybatis.generator; import java.util.List; import org.mybatis.generator.api.CommentGenerator; import org.mybatis.generator.api.IntrospectedTable; import org.mybatis.generator.api.PluginAdapter; import org.mybatis.generator.api.dom.java.Field; import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType; import org.mybatis.generator.api.dom.java.Interface; 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.api.dom.xml.Attribute; import org.mybatis.generator.api.dom.xml.Element; import org.mybatis.generator.api.dom.xml.TextElement; import org.mybatis.generator.api.dom.xml.XmlElement; public class MyPlugin extends PluginAdapter { @Override public boolean validate(List<String> arg0) { return true; } @Override public boolean sqlMapSelectByPrimaryKeyElementGenerated(XmlElement element, IntrospectedTable introspectedTable) { element.getAttributes().remove(2); element.addAttribute(new Attribute("parameterType", introspectedTable .getBaseRecordType())); return super.sqlMapSelectByPrimaryKeyElementGenerated(element, introspectedTable); } @Override public boolean sqlMapDeleteByPrimaryKeyElementGenerated(XmlElement element, IntrospectedTable introspectedTable) { element.getAttributes().remove(1); element.addAttribute(new Attribute("parameterType", introspectedTable .getBaseRecordType())); return super.sqlMapDeleteByPrimaryKeyElementGenerated(element, introspectedTable); } @Override public boolean clientDeleteByPrimaryKeyMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable) { method.getParameters().remove(0); String type = introspectedTable.getBaseRecordType(); method.addParameter(new Parameter(new FullyQualifiedJavaType(type), type.substring(type.lastIndexOf(".") + 1).toLowerCase())); return super.clientDeleteByPrimaryKeyMethodGenerated(method, interfaze, introspectedTable); } @Override public boolean clientSelectByPrimaryKeyMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable) { method.getParameters().remove(0); String type = introspectedTable.getBaseRecordType(); method.addParameter(new Parameter(new FullyQualifiedJavaType(type), type.substring(type.lastIndexOf(".") + 1).toLowerCase())); return super.clientSelectByPrimaryKeyMethodGenerated(method, interfaze, introspectedTable); } @Override public boolean sqlMapUpdateByExampleSelectiveElementGenerated( XmlElement element, IntrospectedTable introspectedTable) { element.getElements().remove(0); StringBuilder sb = new StringBuilder(); sb.append("update "); sb.append(introspectedTable .getAliasedFullyQualifiedTableNameAtRuntime().replace( "${tablesite}", "${record.tablesite}")); element.addElement(0, new TextElement(sb.toString())); return super.sqlMapUpdateByExampleSelectiveElementGenerated(element, introspectedTable); } @Override public boolean sqlMapUpdateByExampleWithoutBLOBsElementGenerated( XmlElement element, IntrospectedTable introspectedTable) { element.getElements().remove(0); StringBuilder sb = new StringBuilder(); sb.append("update "); sb.append(introspectedTable .getAliasedFullyQualifiedTableNameAtRuntime().replace( "${tablesite}", "${record.tablesite}")); element.addElement(0, new TextElement(sb.toString())); return super.sqlMapUpdateByExampleWithoutBLOBsElementGenerated(element, introspectedTable); } @Override public boolean modelBaseRecordClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) { addTableSite(topLevelClass, introspectedTable, "tablesite"); return super.modelBaseRecordClassGenerated(topLevelClass, introspectedTable); } @Override public boolean modelExampleClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) { addTableSite(topLevelClass, introspectedTable, "tablesite"); return super.modelExampleClassGenerated(topLevelClass, introspectedTable); } private void addTableSite(TopLevelClass topLevelClass, IntrospectedTable introspectedTable, String name) { CommentGenerator commentGenerator = context.getCommentGenerator(); Field field = new Field(); field.setVisibility(JavaVisibility.PROTECTED); field.setType(FullyQualifiedJavaType.getIntInstance()); field.setName(name); field.setInitializationString("-1"); commentGenerator.addFieldComment(field, introspectedTable); topLevelClass.addField(field); char c = name.charAt(0); String camel = Character.toUpperCase(c) + name.substring(1); Method method = new Method(); method.setVisibility(JavaVisibility.PUBLIC); method.setName("set" + camel); method.addParameter(new Parameter(FullyQualifiedJavaType .getIntInstance(), name)); method.addBodyLine("this." + name + "=" + name + ";"); commentGenerator.addGeneralMethodComment(method, introspectedTable); topLevelClass.addMethod(method); method = new Method(); method.setVisibility(JavaVisibility.PUBLIC); method.setReturnType(FullyQualifiedJavaType.getIntInstance()); method.setName("get" + camel); method.addBodyLine("return " + name + ";"); commentGenerator.addGeneralMethodComment(method, introspectedTable); topLevelClass.addMethod(method); } @Override public boolean sqlMapBaseColumnListElementGenerated(XmlElement element, IntrospectedTable introspectedTable) { List<Element> elist = element.getElements(); int size = elist.size(); Element e = elist.get(size - 1); String str = e.getFormattedContent(0); e = new TextElement(str + ", ${tablesite} AS tablesite"); elist.remove(size - 1); elist.add(size - 1, e); return super.sqlMapBaseColumnListElementGenerated(element, introspectedTable); } @Override public boolean sqlMapResultMapWithoutBLOBsElementGenerated( XmlElement element, IntrospectedTable introspectedTable) { List<Element> elist = element.getElements(); XmlElement xe = new XmlElement("result"); xe.addAttribute(new Attribute("column", "tablesite")); xe.addAttribute(new Attribute("property", "tablesite")); xe.addAttribute(new Attribute("jdbcType", "INTEGER")); elist.add(xe); return super.sqlMapResultMapWithoutBLOBsElementGenerated(element, introspectedTable); } @Override public boolean sqlMapResultMapWithBLOBsElementGenerated(XmlElement element, IntrospectedTable introspectedTable) { List<Element> elist = element.getElements(); XmlElement xe = new XmlElement("result"); xe.addAttribute(new Attribute("column", "tablesite")); xe.addAttribute(new Attribute("property", "tablesite")); xe.addAttribute(new Attribute("jdbcType", "INTEGER")); elist.add(xe); return super.sqlMapResultMapWithoutBLOBsElementGenerated(element, introspectedTable); } }
另外配置文件,请参见附件,包括静态表 和 动态表两种。