mybatis-generator从新生成代码时的SQL映射文件覆盖

mybatis generator工具在使用的时候的时候,命令行输入:-overwrite 参数,表示生成的文件会覆盖原来的文件;可是在实际使用中发现,针对mybatis生成的SQL映射文件(xml文件)只能追加,不能覆盖;对于实际的使用中,若是须要对经过该工具自动生成的代码进行从新生成,通常会选择所有文件覆盖的方式;而mybatis generator却没有覆盖的这个功能; 前端

缘由

在检查源码的时候发现 org.mybatis.generator.api.MyBatisGenerator中的generate 方法中,有对于xml文件是覆盖/追加的判断,源代码以下: java

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的参数控制的); sql

咱们但愿overwrite生效的话,必须让isMergeable判断为false,gxf 是一个 GeneratedXmlFile 的实例,是在:233行: shell

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



中生成的;经过Context的generateFiles方法中,是调用:generatedXmlFiles.addAll(introspectedTable.getGeneratedXmlFiles()); 来生成generatedXmlFiles ; 即针对mybatis3的IntrospectedTable 的实现类:IntrospectedTableMyBatis3Impl,其中的 getGeneratedXmlFiles的方法中,在构造GeneratedXmlFile类;查看该方法的代码以下:(仅:GeneratedXmlFile的构造方法) api

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



对应GeneratedXmlFile 可知,倒数第二个参数便是 boolean isMergeable;原来在这里固定了传入:true ,致使了前端的overwrite无效; mybatis

处理方案

    但愿在不影响原来功能结构的状况下,增长对覆盖功能,即overwrite生效;决定对:IntrospectedTableMyBatis3Impl.getGeneratedXmlFiles方法进行改造,在生成:GeneratedXmlFile 对象的时候,对传入的isMergeable参数,进行控制;IntrospectedTableMyBatis3Impl中,有context的属性,决定对配置文件的Context 增长一个 mergeable 的属性;用于控制是否覆盖;因为从新生成的时候,覆盖的可能性更大,在默认没有设置该属性的时候,mergeable属性为:false,改造后的getGeneratedXmlFiles代码以下: app

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; 工具

相关文章
相关标签/搜索