2017-04-06 27 views
2

像标题一样,当我执行mybatis生成器时,我想覆盖已经生成的* Mapper.xml全部,而不是合并! 但我尝试了很多配置方式,它没有实现正确。 和每次都是发生器一次的XML内容。 这样的:如何让MyBatis Generator覆盖已经生成的* Mapper.xml?

<resultMap id="BaseResultMap" type="com.test.entity.GoodsEntity"> ... 
<resultMap id="BaseResultMap" type="com.test.entity.GoodsEntity"> ... 
<resultMap id="BaseResultMap" type="com.test.entity.GoodsEntity"> ... 
在属性

,我不得不添加此行:

<mybatis.generator.overwrite>true</mybatis.generator.overwrite> 

和在构建>插件,我添加下面的行:

<plugin> 
      <groupId>org.mybatis.generator</groupId> 
      <artifactId>mybatis-generator-maven-plugin</artifactId> 
      <version>1.3.5</version> 
      <configuration> 
       <verbose>true</verbose> 
       <overwrite>true</overwrite> 
       <configurationFile>${mybatis.generator.configurationFile}</configurationFile> 
      </configuration> 
      <executions> 
       <execution> 
        <id>Generate MyBatis Artifacts</id> 
        <goals> 
         <goal>generate</goal> 
        </goals> 
       </execution> 
      </executions> 
      <dependencies> 
       <dependency> 
        <groupId>com.test</groupId> 
        <artifactId>ob-maven-plugin-mybatis-generator</artifactId> 
        <version>1.0</version> 
       </dependency> 
      </dependencies> 
     </plugin> 

在MyBatis的-generator.xml,我尝试覆盖配置。 所有配置它不工作咕。

我该如何修改配置?

回答

0

我能够通过创建一个插件并将其添加到mybatis-generator-config.xml文件来解决此问题。 当然,请注意,无论是否指定-overwrite标志,此解决方案都将导致Mapper.xml文件始终被覆盖。

MyBatis的发电机-config.xml中:

<generatorConfiguration> 
    ... 
    <context id="myContextId"> 
     <plugin type="com.mydomain.DeleteExistingSqlMapsPlugin"></plugin> 
     ... 
    </context> 
</generatorConfiguration> 

DeleteExistingSqlMapsPlugin.java:

... 
public class DeleteExistingSqlMapsPlugin extends PluginAdapter { 

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

    @Override 
    public boolean sqlMapGenerated(GeneratedXmlFile sqlMap, 
      IntrospectedTable introspectedTable) 
    { 
     String sqlMapPath = sqlMap.getTargetProject() + File.separator 
       + sqlMap.getTargetPackage().replaceAll("\\.", File.separator) 
       + File.separator + sqlMap.getFileName(); 
     File sqlMapFile = new File(sqlMapPath); 

     sqlMapFile.delete(); 

     return true; 
    } 

} 

这工作,因为sqlMapGenerated()是一个Mapper.xml文件后,称的上是在内存中但在写入磁盘之前创建。

+0

不是sqlMap.getTargetPackage()。replaceAll(“\\。”,Matcher.quoteReplacement(File.separator))'? –

0

我遇到同样的问题today.To解决这个问题,只需要改变的MyBatis - 发电机 - Maven的插件版本。

<mybatis-generator-maven-plugin.version>1.3.4-SNAPSHOT</mybatis-generator-maven-plugin.version> 
+0

我修改1.3.5到1.3.4-SNAPSHOT,它不适合我。 – kookob

1

MyBatis的发电机将始终合并XML文件,如果找到匹配。目前没有选择可以关闭该功能。

0

我写了一个插件来合并xml映射器文件。

修改mybatis-generator-core结合java和xml。

这可以让你的xml和java文件的修改不会被覆盖。

https://github.com/zwxbest/mybatis-generator-plugin

用法:

<generatorConfiguration> 
    ... 
    <context id="myContextId"> 
     <plugin type="com.mydomain.CombineXmlPlugin"></plugin> 
     ... 
    </context> 
</generatorConfiguration> 

插件代码:

package com.haitian.plugins; 

import org.mybatis.generator.api.GeneratedXmlFile; 
import org.mybatis.generator.api.IntrospectedTable; 
import org.mybatis.generator.api.PluginAdapter; 
import org.mybatis.generator.api.ShellCallback; 
import org.mybatis.generator.api.dom.xml.Element; 
import org.mybatis.generator.internal.DefaultShellCallback; 
import org.w3c.dom.Document; 
import org.w3c.dom.NamedNodeMap; 
import org.w3c.dom.Node; 
import org.w3c.dom.NodeList; 

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import java.io.File; 
import java.io.FileInputStream; 
import java.util.Iterator; 
import java.util.List; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

/** 
* User:zhangweixiao 
* Description: 
* old nodes is your existing xml file's first level nodes,like <insert><resultMap> 
* new nodes is mybatis-generator generate for you to combine 
* This compare the first level node's name and "id" attribute of new nodes and old nodes 
* if the two equal,then new node will not generate 
* so this can make you modification in old nodes not override. 
* if you want to regenrate old node,delete it,it will generate new. 
*/ 
public class CombineXmlPlugin extends PluginAdapter { 
    //shellCallback use TargetProject and TargetPackage to get targetFile 
    ShellCallback shellCallback = new DefaultShellCallback(false); 
    //save new nodes 
    org.mybatis.generator.api.dom.xml.Document document; 

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

    /** 
    * assing document variable to get new nodes 
    * @param document 
    * @param introspectedTable 
    * @return 
    */ 
    @Override 
    public boolean sqlMapDocumentGenerated(org.mybatis.generator.api.dom.xml.Document document, 
              IntrospectedTable introspectedTable) { 
     this.document = document; 
     return true; 
    } 


    //new nodes is generated,but not write on disk,we just need to filter. 
    @Override 
    public boolean sqlMapGenerated(GeneratedXmlFile sqlMap, 
            IntrospectedTable introspectedTable) { 

     try { 
      //get old nodes 
      File directory = shellCallback.getDirectory(sqlMap.getTargetProject(), sqlMap.getTargetPackage()); 
      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
      dbf.setValidating(false); 
      DocumentBuilder db = dbf.newDocumentBuilder(); 
      File xmlFile = new File(directory, sqlMap.getFileName()); 
      if (directory.exists() == false || xmlFile.exists() == false) 
       return true; 
      Document doc = db.parse(new FileInputStream(xmlFile)); 
      org.w3c.dom.Element rootElement = doc.getDocumentElement(); 
      NodeList list = rootElement.getChildNodes(); 
      //get new nodes 
      List<Element> elements = document.getRootElement().getElements(); 

      //get nodeName and the value of id attribute use regex 
      Pattern p = Pattern.compile("<(\\w+)\\s+id=\"(\\w+)\""); 

      boolean findSameNode = false; 
      // traverse new nodes to compare old nodes to filter 
      for (Iterator<Element> elementIt = elements.iterator(); elementIt.hasNext();) { 
       findSameNode = false; 
       String newNodeName = ""; 
       String NewIdValue = ""; 
       Element element = elementIt.next(); 
       Matcher m = p.matcher(element.getFormattedContent(0)); 
       if (m.find()) { 
        //get nodeName and the value of id attribute 
        newNodeName = m.group(1); 
        NewIdValue = m.group(2); 
       } 
       //if the nodeName of newNode and oldNode are equal 
       //and the id attribute of newNode and oldNode are equal 
       //then filter newNode 
       for (int i = 0; i < list.getLength(); i++) { 
        Node node = list.item(i); 
        if (node.getNodeType() == Node.ELEMENT_NODE) { 
         if (newNodeName.equals(node.getNodeName())) { 
          NamedNodeMap attr = node.getAttributes(); 
          for (int j = 0; j < attr.getLength(); j++) { 
           Node attrNode = attr.item(j); 
           if (attrNode.getNodeName().equals("id") && attrNode.getNodeValue().equals(NewIdValue)) { 
            //filter new node,just delete it ,and it will not generate 
            elementIt.remove(); 
            findSameNode = true; 
            break; 
           } 
          } 
          if (findSameNode == true) 
           break; 
         } 
        } 
       } 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return true; 
    } 
} 

添加 “batchInsert”,并delte insertSelective,并修改其它节点。 然后重新生成xml映射文件,只有insertSelective会被生成,其他的不会被覆盖。

+1

虽然这个链接可能回答这个问题,但最好在这里包含答案的基本部分,并提供参考链接。如果链接页面更改,则仅链接答案可能会失效。 - [来自评论](/ review/low-quality-posts/18692988) – TheDude