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