2017-04-06 283 views
2

タイトルと同様に、mybatis-generatorを実行すると、すでに生成された* 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> 

とビルドに>プラグインは、私は、行の下に追加します。MyBatisの中

<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> 

-generator.xml、私はまだconfigを上書きしようとします。 すべての設定は動作しません。

どのように設定を変更できますか?

答えて

0

私はプラグインを作成し、MyBatisの発電-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; 
    } 

} 

Mapper.xmlファイルがある後sqlMapGenerated()が呼び出されるので、これは動作しますメモリに作成され、ディスクに書き込まれる前に作成されます。

+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マッパーファイルをマージするためのプラグインを作成。

とJavaおよびXMLを組み合わせることmodifiy MyBatisの発電機コア。

これは、変更が上書きされることはありませ君の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" を追加し、insertSelectiveをdelte、および他のノードを変更します。 xmlマッパーファイルを再生成すると、insertSelectiveだけが生成され、他のものは上書きされません。

+1

このリンクは質問に答えるかもしれませんが、答えの本質的な部分をここに含めて参考にしてください。リンクされたページが変更された場合、リンクのみの回答は無効になります。 - [レビューから](/レビュー/低品質の投稿/ 18692988) – TheDude

関連する問題