mybatis-generator從新生成代碼時的SQL映射文件覆蓋

mybatis generator工具在使用的時候的時候,命令行輸入:-overwrite 參數,表示生成的文件會覆蓋原來的文件;可是在實際使用中發現,針對mybatis生成的SQL映射文件(xml文件)只能追加,不能覆蓋;對於實際的使用中,若是須要對經過該工具自動生成的代碼進行從新生成,通常會選擇所有文件覆蓋的方式;而mybatis generator卻沒有覆蓋的這個功能;前端

緣由

在檢查源碼的時候發現 org.mybatis.generator.api.MyBatisGenerator中的generate 方法中,有對於xml文件是覆蓋/追加的判斷,源代碼以下:sql

 

try {
 File directory = shellCallback.getDirectory(gxf.getTargetProject(), gxf.getTargetPackage());
 targetFile = new File(directory, gxf.getFileName());
 if (targetFile.exists()) {
   if (gxf.isMergeable()) {
     source = XmlFileMergerJaxp.getMergedSource(gxf,targetFile);
   } else if (shellCallback.isOverwriteEnabled()) {
     source = gxf.getFormattedContent();
     warnings.add(getString("Warning.11", targetFile.getAbsolutePath()));
   } else {
     source = gxf.getFormattedContent();
     targetFile = getUniqueFileName(directory, gxf.getFileName());
     warnings.add(getString("Warning.2", targetFile.getAbsolutePath())); 
   }
 } else {
   source = gxf.getFormattedContent();
 }
} catch (ShellException e) {
 warnings.add(e.getMessage());
 continue;
}

 

 

 

經過其中的代碼可知:先對gxf.isMergeable屬性進行判斷,是否合併(即追加),若是不合並的話,那麼判斷:shellCallback.isOverwriteEnabled() (這個屬性是經過命令行的輸入的 overwrite的參數控制的);shell

咱們但願overwrite生效的話,必須讓isMergeable判斷爲false,gxf 是一個 GeneratedXmlFile 的實例,是在:233行:api

 

context.generateFiles(callback, generatedJavaFiles, generatedXmlFiles, warnings);

 

 

 

中生成的;經過Context的generateFiles方法中,是調用:generatedXmlFiles.addAll(introspectedTable.getGeneratedXmlFiles()); 來生成generatedXmlFiles ; 即針對mybatis3的IntrospectedTable 的實現類:IntrospectedTableMyBatis3Impl,其中的 getGeneratedXmlFiles的方法中,在構造GeneratedXmlFile類;查看該方法的代碼以下:(僅:GeneratedXmlFile的構造方法)mybatis

 

GeneratedXmlFile gxf = new GeneratedXmlFile(document, 
getMyBatis3XmlMapperFileName(), getMyBatis3XmlMapperPackage(), 
context.getSqlMapGeneratorConfiguration().getTargetProject(), 
true, context.getXmlFormatter());

 

 

 

對應GeneratedXmlFile 可知,倒數第二個參數便是 boolean isMergeable;原來在這裏固定了傳入:true ,致使了前端的overwrite無效;app

處理方案

    但願在不影響原來功能結構的狀況下,增長對覆蓋功能,即overwrite生效;決定對:IntrospectedTableMyBatis3Impl.getGeneratedXmlFiles方法進行改造,在生成:GeneratedXmlFile 對象的時候,對傳入的isMergeable參數,進行控制;IntrospectedTableMyBatis3Impl中,有context的屬性,決定對配置文件的Context 增長一個 mergeable 的屬性;用於控制是否覆蓋;因爲從新生成的時候,覆蓋的可能性更大,在默認沒有設置該屬性的時候,mergeable屬性爲:false,改造後的getGeneratedXmlFiles代碼以下:函數

 

if (xmlMapperGenerator != null) { 
  Document document = xmlMapperGenerator.getDocument(); 
/** 
* 原來中的 GeneratedXmlFile 保留;將其中構造函數中的true 修改成 : false; 
* 設置 isMergeable = false; 在生成 xml文件的時候,將不是合併,而是直接覆蓋; 
*/ 
/*GeneratedXmlFile gxf = new GeneratedXmlFile(document, 
getMyBatis3XmlMapperFileName(), getMyBatis3XmlMapperPackage(), 
context.getSqlMapGeneratorConfiguration().getTargetProject(), 
true, context.getXmlFormatter());*/ 
  String tmp = context.getProperty("mergeable"); 
  boolean mergeable = false; 
  if("true".equalsIgnoreCase(tmp)){ 
    mergeable = true; 
  } 
  GeneratedXmlFile gxf = new GeneratedXmlFile(document, 
    getMyBatis3XmlMapperFileName(), getMyBatis3XmlMapperPackage(), 
    context.getSqlMapGeneratorConfiguration().getTargetProject(), 
    mergeable, context.getXmlFormatter()); 
  if (context.getPlugins().sqlMapGenerated(gxf, this)) { 
    answer.add(gxf); 
  } 
}

 

 

 

對generatorMybatis配置文件的Context標籤下,能夠增長屬性標籤,名稱爲:mergeable;例如:工具

 

<property name="mergeable" value="false"></property>

 

 

 

該屬性,僅在確實須要進行合併,而不是覆蓋的狀況下使用,且值要求爲:true;沒有該屬性的時候,默認爲false;this

相關文章
相關標籤/搜索