java打包会覆盖mapper_Mybatis generator mapper文件重新生成不会覆盖原文件

转载自http://www.voidcn.com/article/p-wbxpqlmy-bon.html

问题:

使用标题所述的generator,在生成xxxMapper.xml文件后,再生成一次,新的内容会以追加的方式加入到原来的xxxMapper.xml文件中。(通常我是希望覆盖的)

寻找到的原因:

在IntrospectedTableMyBatis3Impl.getGeneratedXmlFiles方法中,isMergeable值被写死为true了。

GeneratedXmlFile gxf = new GeneratedXmlFile(document,

getMyBatis3XmlMapperFileName(), getMyBatis3XmlMapperPackage(),

context.getSqlMapGeneratorConfiguration().getTargetProject(),

true, context.getXmlFormatter());

而MyBatisGenerator.writeGeneratedXmlFile方法中使用到该属性了。代码如下:

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())); //$NON-NLS-1$

}

} else {

source = gxf.getFormattedContent();

}

关键点就在第2行,结果导致每次重新生成后都是追加。

解决方法:

我认为这是一个小bug,为了不用修改源码,重新打包,造成包不一致,我还是希望在运行时处理它。经过一番折腾,终于找到方法了。使用反射在运行时把isMergeable强制改成false。

具体做法是:

1.编写一个插件

public class OverIsMergeablePlugin extends PluginAdapter {

@Override

public boolean validate(Listwarnings) {

return true;

}

@Override

public boolean sqlMapGenerated(GeneratedXmlFile sqlMap, IntrospectedTable introspectedTable) {

try {

Field field = sqlMap.getClass().getDeclaredField("isMergeable");

field.setAccessible(true);

field.setBoolean(sqlMap, false);

} catch (Exception e) {

e.printStackTrace();

}

return true;

}

}

2.配置generatorConfig.xml

commentGenerator>

jdbcConnection>

javaTypeResolver>

javaModelGenerator>

sqlMapGenerator>

javaClientGenerator>

context>

generatorConfiguration>

3.运行生成程序

public static void main(String[] args) throws Exception {

Listwarnings = new ArrayList();

boolean overwrite = true;

ConfigurationParser cp = new ConfigurationParser(warnings);

Configuration config = cp.parseConfiguration(Main.class.getClassLoader().getResourceAsStream("generatorConfig.xml"));

DefaultShellCallback callback = new DefaultShellCallback(overwrite);

MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);

myBatisGenerator.generate(null);

System.out.println("----ok----");

}

大功告成!嘻嘻!(对了,最后那个overwrite一定要设置为true哦,不然的话,每次生成的文件都会在文件名最后加个“点数字”—原因从前面贴的第二段代码中可以找到)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值