Generator 插件开发:
完整实例:http://download.csdn.net/detail/ht_00001/9514922
1 继承:org.mybatis.generator.api.PluginAdapter;
public class RepositoryPlugin extends PluginAdapter{}
2 对DAO类的修改:
重写:
public List<GeneratedJavaFile> contextGenerateAdditionalJavaFiles(
IntrospectedTable introspectedTable);
3 复写创建DAO类
继承:org.mybatis.generator.codegen.AbstractJavaGenerator
public class RepositoryJavaGenerator extends AbstractJavaGenerator{}
重写:
public List<CompilationUnit> getCompilationUnits(){}
新创建DAO类
Interface inter =new Interface(new FullyQualifiedJavaType(String className));
设置类的修饰符
inter.setVisibility(JavaVisibility.PUBLIC);//public 属性
导入包
inter.addImportedType(new FullyQualifiedJavaType(String importName))
或
inter.addImportedType(String importName)
继承接口
inter.addSuperInterface(new FullyQualifiedJavaType(String fatherName))
实例:
package plugin; import java.util.ArrayList; import java.util.List; import org.mybatis.generator.api.dom.java.CompilationUnit; 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.codegen.AbstractJavaGenerator; public class RepositoryJavaGenerator extends AbstractJavaGenerator { @Override @SuppressWarnings({ "rawtypes", "unchecked" }) public List<CompilationUnit> getCompilationUnits() { String pack = context.getProperty("repositoryTargetPackage"); FullyQualifiedJavaType type = new FullyQualifiedJavaType( new StringBuffer(pack).append("."). append(introspectedTable.getFullyQualifiedTable().getDomainObjectName()). append("Mapper").toString()); Interface inter = new Interface(type); inter.setVisibility(JavaVisibility.PUBLIC); inter.addImportedType(new FullyQualifiedJavaType (introspectedTable.getBaseRecordType())); inter.addSuperInterface(new FullyQualifiedJavaType( new StringBuffer("BaseRepository<"). append(introspectedTable.getFullyQualifiedTable().getDomainObjectName()). append(">").toString() )); List answer = new ArrayList(); answer.add(inter); return answer; } }
package plugin; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.mybatis.generator.api.GeneratedJavaFile; import org.mybatis.generator.api.IntrospectedTable; import org.mybatis.generator.api.PluginAdapter; import org.mybatis.generator.api.dom.java.CompilationUnit; import org.mybatis.generator.api.dom.xml.Attribute; import org.mybatis.generator.api.dom.xml.Document; import org.mybatis.generator.api.dom.xml.XmlElement; public class RepositoryPlugin extends PluginAdapter { @Override public boolean validate(List<String> warnings) { return true; } /** * dao类 */ @SuppressWarnings({ "unchecked", "rawtypes" }) @Override public List<GeneratedJavaFile> contextGenerateAdditionalJavaFiles( IntrospectedTable introspectedTable) { RepositoryJavaGenerator repository = new RepositoryJavaGenerator(); repository.setContext(context); repository.setIntrospectedTable(introspectedTable); List units = repository.getCompilationUnits(); List generatedFile = new ArrayList(); GeneratedJavaFile gif; for (Iterator iterator = units.iterator(); iterator.hasNext();generatedFile.add(gif)) { CompilationUnit unit = (CompilationUnit) iterator.next(); gif = new GeneratedJavaFile(unit,context.getJavaModelGeneratorConfiguration().getTargetProject(), context.getProperty("javaFileEncoding"),context.getJavaFormatter()); } return generatedFile; } }
4 获取generator.xml 中context的property属性值
context.getProperty("name")
5 获取实体类的全类名
introspectedTable.getBaseRecordType()
6 获取实体类的类名
introspectedTable.getFullyQualifiedTable().getDomainObjectName()
或者
context.getTableConfigurations().get(0).getDomainObjectName()//0表示第几张表的实体类
7 对XML修改:
重写:
public boolean sqlMapDocumentGenerated(Document document,
IntrospectedTable introspectedTable);
实例:
package plugin; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.mybatis.generator.api.GeneratedJavaFile; import org.mybatis.generator.api.IntrospectedTable; import org.mybatis.generator.api.PluginAdapter; import org.mybatis.generator.api.dom.java.CompilationUnit; import org.mybatis.generator.api.dom.xml.Attribute; import org.mybatis.generator.api.dom.xml.Document; import org.mybatis.generator.api.dom.xml.XmlElement; public class RepositoryPlugin extends PluginAdapter { @Override public boolean validate(List<String> warnings) { return true; } /** * xml的命名空间定义 */ @Override public boolean sqlMapDocumentGenerated(Document document, IntrospectedTable introspectedTable) { String pack = context.getProperty("repositoryTargetPackage"); XmlElement rootElement = document.getRootElement(); rootElement.getAttributes().clear(); rootElement.addAttribute(new Attribute("namespace", new StringBuffer(pack).append("."). append(introspectedTable.getFullyQualifiedTable().getDomainObjectName()). append("Mapper").toString() )); return super.sqlMapDocumentGenerated(document, introspectedTable); } }
8 获取根节点
XmlElement rootElement = document.getRootElement()
9 添加属性
rootElement.addAttribute(new Attribute(String name, String value))
10 清除节点的所有属性
rootElement.getAttributes().clear();
11 新增节点
rootElement.addElement(XmlElement element)
12 新增SQL的文本信息
rootElement.addElement(TextElement element)
13 获取所有的表字段
List<IntrospectedColumn> list = introspectedTable.getAllColumns();
14 获取表名
introspectedTable.getFullyQualifiedTableNameAtRuntime()
15 获取主键
List<IntrospectedColumn> list = introspectedTable.getPrimaryKeyColumns();
16 获取表字段的名称
MyBatis3FormattingUtilities.getSelectListPhrase(IntrospectedColumn introspectedColumn)
分页查询实例:
package plugin; import java.util.Iterator; 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.xml.Attribute; import org.mybatis.generator.api.dom.xml.Document; import org.mybatis.generator.api.dom.xml.TextElement; import org.mybatis.generator.api.dom.xml.XmlElement; import org.mybatis.generator.codegen.mybatis3.MyBatis3FormattingUtilities; /** * mySql的分也查询 * @author huang_tao * */ public class SelectPagePlugin extends PluginAdapter { @Override public boolean validate(List<String> warnings) { return true; } @Override public boolean sqlMapDocumentGenerated(Document document, IntrospectedTable introspectedTable) { XmlElement rootElement = document.getRootElement(); XmlElement answer = new XmlElement("select"); answer.addAttribute(new Attribute("id","selectByPage")); answer.addAttribute(new Attribute("resultMap","BaseResultMap")); answer.addAttribute(new Attribute("parameterType", "java.lang.Integer")); StringBuffer sb = new StringBuffer(); Iterator<IntrospectedColumn> iter = introspectedTable.getAllColumns().iterator(); sb.append("select "); makeXmlElement(answer,sb); sb.append(" "); while(iter.hasNext()){ sb.append(" "+MyBatis3FormattingUtilities.getSelectListPhrase(iter.next())); if(iter.hasNext()){ sb.append(" ,"); } } makeXmlElement(answer,sb); sb.append("from "); makeXmlElement(answer,sb); sb.append(" "); sb.append(" "+introspectedTable.getFullyQualifiedTableNameAtRuntime()); makeXmlElement(answer,sb); sb.append("order by "); iter = introspectedTable.getPrimaryKeyColumns().iterator(); while(iter.hasNext()){ sb.append(" "+MyBatis3FormattingUtilities.getSelectListPhrase(iter.next())); if(iter.hasNext()){ sb.append(" ,"); } } makeXmlElement(answer,sb); sb.append("limit ").append("10 * (#{page,jdbcType=INTEGER}-1)"). append(" , ").append("10 * #{page,jdbcType=INTEGER}"); makeXmlElement(answer,sb); rootElement.addElement(answer); return super.sqlMapDocumentGenerated(document, introspectedTable); } private void makeXmlElement(XmlElement answer,StringBuffer sb){ if(sb.length()>0){ answer.addElement(new TextElement(sb.toString())); sb.setLength(0); } } }
17 对实体类的修改
重写
public boolean modelBaseRecordClassGenerated(TopLevelClass topLevelClass,
IntrospectedTable introspectedTable)
添加修饰符
context.getCommentGenerator().addFieldComment(Field file,
IntrospectedTable introspectedTable);
topLevelClass.addField(Field file);
添加方法
context.getCommentGenerator().addGeneralMethodComment(Method method,
IntrospectedTable introspectedTable);
topLevelClass.addMethod(Method method);
添加标签
method.addAnnotation("@Override")
设置属性
method.setVisibility(JavaVisibility.PUBLIC);//public 属性
添加返回值
method.setReturnType(FullyQualifiedJavaType returnType)
设置名称
method.setName("toString")
方法添加方法体
method.addBodyLine(String message)
获取所有的属性
topLevelClass.getFields()
设是否为final
method.setFinal(Boolean boolean); //默认false
设置是否为static
method.setStatic(Boolean boolean); //默认false
设置方法是否带锁
method.setSynchronized(Boolean boolean); //默认false
属性设置类型
field.setType(new FullyQualifiedJavaType(String));
属性设置值
field.setInitializationString(String message)
实例可见 mybatis-generator-core.jar
添加方法:org.mybatis.generator.plugins.ToStringPlugin{};
添加属性:org.mybatis.generator.plugins.SerializablePlugin