怎么能让MyBatis Generator覆盖已经生成的* Mapper.xml?

时间:2017-04-06 03:16:13

标签: maven pom.xml mybatis overwrite mybatis-generator

与title一样,当我执行mybatis-generator时,我想覆盖已生成的* Mapper.xml,而不是合并! 但我尝试了很多配置方式,它没有实现正确。 并且每次生成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>

并在构建&gt;插件,我添加以下行:

<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中,我尝试覆盖配置。 所有配置它都不起作用。

我该如何修改配置?

4 个答案:

答案 0 :(得分:1)

如果找到匹配项,MyBatis生成器将始终合并XML文件。目前没有办法将其关闭。

答案 1 :(得分:1)

您可以在Mybatis Generator 1.3.7中使用插件<plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin" />覆盖xml。

请参见http://www.mybatis.org/generator/reference/plugins.html

  

此插件将为生成的映射器XML文件禁用XML合并功能。这将使生成器以与处理Java文件相同的方式来尊重XML文件的覆盖标志-如果覆盖为true,则将覆盖现有文件,否则将使用唯一名称写入新文件。      

如果您禁用所有评论,此插件将很有帮助。

在Mybatis Generator配置文件中设置<property name="suppressAllComments" value="true" />可能会导致此问题。 Mybatis Generator使用注释标志来决定是否合并XML。

  

如果禁用所有注释,则可能会发现UnmergeableXmlMappersPlugin有用。这将使生成器遵守XML文件的覆盖标志。

请参见http://www.mybatis.org/generator/configreference/commentGenerator.html

答案 2 :(得分:0)

我今天遇到了同样的问题。要解决这个问题,只需要更改mybatis-generator-maven-plugin的版本。

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

答案 3 :(得分:0)

我写了一个插件来合并xml mapper文件。

修改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;
    }
}

添加&#34; batchInsert&#34;和delte insertSelective,并修改其他节点。 然后重新生成xml映射文件,只生成insertSelective,其他不会被覆盖。