Как мог MyBatis Generator перезаписать уже сгенерированный *Mapper.xml?

Как и заголовок, когда я запускаю mybatis-генератор, я хочу перезаписать все сгенерированные *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>

и в плагин build > я добавляю следующие строки:

<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 я пытаюсь переписать конфигурацию еще. все конфиги не работают

Как я могу изменить конфигурацию?

5 ответов

Решение

Я смог обойти это, создав плагин и добавив его в файл mybatis-generator-config.xml. Обратите внимание, конечно, что это решение приведет к тому, что файлы Mapper.xml будут всегда перезаписываться независимо от того, задан или нет флаг -overwrite.

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 в памяти, но до его записи на диск.

Вы можете использовать плагин <plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin" /> в Mybatis Generator 1.3.7 перезаписать xml.

См. http://www.mybatis.org/generator/reference/plugins.html

Этот плагин отключит функцию слияния XML для сгенерированных картографических XML-файлов. Это заставит генератор уважать флаг перезаписи для файлов XML так же, как и для файлов Java - если перезапись имеет значение true, тогда существующий файл будет перезаписан, в противном случае новый файл будет записан с уникальным именем.

Этот плагин может быть полезен, если вы отключите все комментарии.

настройка <property name="suppressAllComments" value="true" /> в конфигурационном файле Mybatis Generator может вызвать эту проблему. Mybatis Generator использует флаг комментариев, чтобы решить, следует ли объединять XML.

Если вы отключите все комментарии, вы можете найти UnmergeableXmlMappersPlugin полезно. Это заставит генератор уважать флаг перезаписи для файлов XML.

См. http://www.mybatis.org/generator/configreference/commentGenerator.html

Генератор MyBatis всегда объединяет XML-файлы, если находит совпадение. В настоящее время нет возможности отключить это.

Я столкнулся с той же проблемой сегодня. Чтобы решить эту проблему, просто нужно изменить версию mybatis-generator-maven-plugin。

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

Я пишу плагин для слияния файла 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, другие не будут переопределены.

Другие вопросы по тегам