mybatis使用generator生成器生成entity,mapper,xml模版類及自己寫sql情況處理

在使用mybatis時總是要生成實體類,mapper以及常用的mapper.xml文件,手寫既沒有技術含量還浪費時間,所以使用generator生成器會很方便。
pom.xml配置:

<dependency>
				<groupId>org.mybatis.generator</groupId>
				<artifactId>mybatis-generator-core</artifactId>
				<version>1.3.7</version>
			</dependency>

generator.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>
  <context id="mysql" defaultModelType="flat">
    <property name="autoDelimitKeywords" value="true" />
    <property name="beginningDelimiter" value="`" />
    <property name="endingDelimiter" value="`" />
    <plugin type="com.weiqu.video.dao.generator.PaginationPlugin"></plugin>
    <plugin type="org.mybatis.generator.plugins.ToStringPlugin"></plugin>
    <plugin type="com.weiqu.video.dao.generator.DeleteByExampleMysqlBugFixedPlugin"></plugin>
      <!--覆蓋生成XML文件-->
      <plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin" />
      <commentGenerator>
          <property name="suppressAllComments" value="true" />
      </commentGenerator>
     <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/longvideo?autoReconnect=true&amp;failOverReadOnly=false&amp;characterEncoding=UTF-8"
      userId="root" password="root" /> 
     <javaModelGenerator targetPackage="com.dao.model.test" targetProject="../model/src/main/java" />
     <sqlMapGenerator targetPackage="mapper.test" targetProject="../model/src/main/resources" /> 
     <javaClientGenerator targetPackage="com.dao.mapper.video" targetProject="../dao/src/main/java" type="XMLMAPPER" />
    <table tableName="wx_test" domainObjectName="WxTest" alias=""></table>
  </context>
</generatorConfiguration>

DeleteByExampleMysqlBugFixedPlugin.java

package com.weiqu.video.dao.generator;

import java.util.Iterator;
import java.util.List;

import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.PluginAdapter;
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 DeleteByExampleMysqlBugFixedPlugin extends PluginAdapter {

  public boolean validate(List<String> warnings) {
    return true;
  }

  @Override
  public boolean sqlMapDeleteByExampleElementGenerated(XmlElement element, IntrospectedTable introspectedTable) {

    List<Element> elements = element.getElements();
    Iterator<Element> it = elements.iterator();
    while (it.hasNext()) {
      Element e = it.next();
      if (e instanceof TextElement) {
        String content = ((TextElement) e).getContent();
        if (content.contains("delete from")) {
          it.remove();
          break;
        }
      }
    }
    StringBuilder sb = new StringBuilder();
    sb.append("delete from "); //$NON-NLS-1$
    sb.append(introspectedTable.getFullyQualifiedTableNameAtRuntime());
    element.addElement(elements.size() - 1, new TextElement(sb.toString()));
    return true;
  }
}

PaginationPlugin.java

package com.weiqu.video.dao.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.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.TextElement;
import org.mybatis.generator.api.dom.xml.XmlElement;

public class PaginationPlugin extends PluginAdapter {

	@Override
	public boolean modelExampleClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
		addPage(topLevelClass, introspectedTable, "page");
		return super.modelExampleClassGenerated(topLevelClass, introspectedTable);
	}

	@Override
	public boolean sqlMapSelectByExampleWithoutBLOBsElementGenerated(XmlElement element,
			IntrospectedTable introspectedTable) {
		XmlElement page = new XmlElement("if");
		page.addAttribute(new Attribute("test", "page != null"));
		page.addElement(new TextElement("limit #{page.offset} , #{page.pageSize}"));
		element.addElement(page);
		return super.sqlMapUpdateByExampleWithoutBLOBsElementGenerated(element, introspectedTable);
	}

	@Override
	public boolean sqlMapSelectByExampleWithBLOBsElementGenerated(XmlElement element,
			IntrospectedTable introspectedTable) {
		XmlElement page = new XmlElement("if");
		page.addAttribute(new Attribute("test", "page != null"));
		page.addElement(new TextElement("limit #{page.offset} , #{page.pageSize}"));
		element.addElement(page);
		return super.sqlMapSelectByExampleWithBLOBsElementGenerated(element, introspectedTable);
	}

	/**
	 * @param topLevelClass
	 * @param introspectedTable
	 * @param name
	 */
	private void addPage(TopLevelClass topLevelClass, IntrospectedTable introspectedTable, String name) {
		topLevelClass.addImportedType(new FullyQualifiedJavaType("com.weiqu.video.common.util.Page"));
		CommentGenerator commentGenerator = context.getCommentGenerator();
		Field field = new Field();
		field.setVisibility(JavaVisibility.PROTECTED);
		field.setType(new FullyQualifiedJavaType("com.weiqu.video.common.util.Page"));
		field.setName(name);
		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(new FullyQualifiedJavaType("com.weiqu.video.common.util.Page"), name));
		method.addBodyLine("this." + name + "=" + name + ";");
		commentGenerator.addGeneralMethodComment(method, introspectedTable);
		topLevelClass.addMethod(method);
		method = new Method();
		method.setVisibility(JavaVisibility.PUBLIC);
		method.setReturnType(new FullyQualifiedJavaType("com.weiqu.video.common.util.Page"));
		method.setName("get" + camel);
		method.addBodyLine("return " + name + ";");
		commentGenerator.addGeneralMethodComment(method, introspectedTable);
		topLevelClass.addMethod(method);
	}

	public boolean validate(List<String> arg0) {
		return true;
	}
}

MybatisGeneratorMain.java

package com.weiqu.video.dao.generator;

import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
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.exception.InvalidConfigurationException;
import org.mybatis.generator.exception.XMLParserException;
import org.mybatis.generator.internal.DefaultShellCallback;

public class MybatisGeneratorMain {

	public static void main(String[] args)
			throws SQLException, IOException, InterruptedException, InvalidConfigurationException, XMLParserException {
		List<String> warnings = new ArrayList<String>();
		/**
		 * 這裏千萬要注意!!哪些分表生成的XML,一般不要動!帶生成後,把表名改成邏輯名,並且遷移到 mapper的shard目錄下
		 */
		boolean overwrite = true;
		// 視頻模塊
		File configFile = new File(MybatisGeneratorMain.class.getResource("/generator/generator.xml").getFile());
		ConfigurationParser cp = new ConfigurationParser(warnings);
		Configuration config = cp.parseConfiguration(configFile);
		DefaultShellCallback callback = new DefaultShellCallback(overwrite);
		MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
		myBatisGenerator.generate(null);
		System.out.println("genreate finish");
	}
}

每次運行MybatisGeneratorMain中的main方法就能重新生成實體類,mapper和xml文件,這也是需要注意的地方,千萬不要在自動生成的mapper.xml中手寫sql,要不在重新運行時覆蓋掉你寫的sql。所以在需要寫新sql時需要重新自己寫一個mapper和xml類,然後使用extends繼承自動生成BaseResultMap,這樣在有字段新增時就不用維護兩個xml了:

<resultMap id="BaseWxUserVideoResultMap" type="com.weiqu.video.dao.model.video.WxVideo" 
     	extends="com.weiqu.video.dao.mapper.video.WxVideoMapper.BaseResultMap">
    </resultMap>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章