Generator 插件开发

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

猜你喜欢

转载自ht00001126-com.iteye.com/blog/2297321
今日推荐