转载自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 {@Overridepublic boolean validate(List<String> warnings) {return true;}@Overridepublic 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

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfigurationPUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN""http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"><!-- 详细文档 http://www.mybatis.org/generator/configreference/xmlconfig.html -->
<generatorConfiguration><properties resource="config.properties" /><context id="generatorContext" targetRuntime="${targetRuntime}"><plugin type="com.wql.customer.OverIsMergeablePlugin" /><commentGenerator type="com.wql.customer.CustomerCommentGenerator"><property name="suppressDate" value="false" /><property name="suppressAllComments" value="false" /><property name="addRemarkComments" value="true" /><property name="dateFormat" value="yyyy-MM-dd HH:mm:ss" /></commentGenerator><jdbcConnection driverClass="${jdbc.driver}" connectionURL="${jdbc.url}" userId="${jdbc.username}" password="${jdbc.password}"></jdbcConnection><javaTypeResolver><property name="forceBigDecimals" value="false" /></javaTypeResolver><javaModelGenerator targetPackage="${model.package}" targetProject="${target.project}"><property name="enableSubPackages" value="true" /><property name="trimStrings" value="true" /></javaModelGenerator><sqlMapGenerator targetPackage="${xml.package}" targetProject="${target.project.resources}"><property name="enableSubPackages" value="true" /></sqlMapGenerator><javaClientGenerator targetPackage="${mapper.package}" targetProject="${target.project}" type="XMLMAPPER"><property name="enableSubPackages" value="true" /></javaClientGenerator><table tableName="${tableName}" domainObjectName="${domainObjectName}" enableCountByExample="${enableCountByExample}" enableUpdateByExample="${enableUpdateByExample}" enableDeleteByExample="${enableDeleteByExample}" enableSelectByExample="${enableSelectByExample}" selectByExampleQueryId="${selectByExampleQueryId}" /></context>
</generatorConfiguration>

3.运行生成程序

public static void main(String[] args) throws Exception {List<String> warnings = new ArrayList<String>();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哦,不然的话,每次生成的文件都会在文件名最后加个“点数字”—原因从前面贴的第二段代码中可以找到)

Mybatis generator mapper文件重新生成不会覆盖原文件相关推荐

  1. HDFS重复上传文件将会覆盖原文件

    HDFS重复上传文件,将会覆盖原文件.

  2. insert overwrite table不会覆盖原文件,而是新增一个文件

    目录 一.背景 二.解决 一.背景 hive insert overwrite table结果发现不会覆盖原文件,而是新增一个文件 本来只有一个文件 insert overwrite table之后变 ...

  3. 从命令行及java程序运行MyBatis Generator 1.3.x生成MyBatis3.x代码

    为什么80%的码农都做不了架构师?>>>    近期因为项目需要,调研了myBatis 3.x的使用,当然,顺便也就研究了一下使用Generator来通过逆向工程生成pojo,map ...

  4. Mybatis generator实战:自动生成POJO类完整解决方案

    目录 1.背景:Mybatis generator根据数据库表自动生成POJO类完整解决方案 2.解决方案:mybatis generator 1.3.6 已经有了这个功能, 2.1.增加了一个新的属 ...

  5. winmerge多个文件夹生成html,功能强大的文件、文件夹比对工具-WinMerge使用教程

    您可能感兴趣的话题: WinMerge 核心提示:给大家介绍一款比对速度很快.比对功能相当强大的免费软件WinMerge,除了可以针对文件名称.文件内容与文件日期..等等细节来做比对之外,还可直接比对 ...

  6. java写入txt文件 不替换_java非覆盖写入文件及在输出文本中换行

    1.在文件末尾写入而不是覆盖 在我们使用FileWrite方法写入文件时,会发现原来的内容被覆盖了,怎么才能做到追加而不是覆盖呢? FileWriter(File file, boolean appe ...

  7. python 读写csv文件(创建、追加、覆盖)_python文件操作

    大神一看题目就知道用python中的string.split('\'),记得之前处理大量的文件的时候,有时候有几十万的文本文件,经常会读取获取名称,并且保存为名字一样的另外一种格式的文件 其实pyth ...

  8. 批处理使用WinRAR压缩某类型的文件,一个文件压缩成一个压缩包,压缩后名称与原文件同名,压缩后删除原文件

    @echo off setlocal enabledelayedexpansion rem winrar安装目录,我的在D盘且目录为下 cd D:\Program Files\WinRAR rem 需 ...

  9. with open(path) as f 追加写入和覆盖原文件的两种使用方法

    在使用with open(path) as f 将数据写入文件时,会发现存在输出正常但是打开保存文件没有改变的情况,此时可能是因为文件的打开方式为追加写方式,更改文件打开方式即可实现再次向文件写入内容 ...

最新文章

  1. 申报成功后怎样修改_【小白教程】12月第3期《申报成功后,如何更正,快快收藏!》...
  2. Android图片360全景旋转
  3. 阿里云量产50家独角兽前夜
  4. 如何通俗理解拉格朗日对偶问题(part2)
  5. python的固定有没有固定字符_python每次处理固定个数的字符的方法总结
  6. 介绍两款API管理工具
  7. 飞思卡尔单片机CAN模块的物理特性的示波器观察
  8. 玩转Vagrant之工作环境的迁移(box的导入与导出)
  9. PHP超全基础知识点
  10. VSCode连接远程服务器
  11. 总结:第三章:过去一年的所遇所思所学所悟以及2021年的规划图
  12. QT的QTreeWidget节点触发事件(一)
  13. java基础案例教程课后答案,华为财经2022春招面试
  14. python采集链家二手房信息
  15. 小程序真机调试报错: errMsg“:“hideLoading:fail:toast can‘t be found“?
  16. 高等数学笔记-乐经良老师-第十一章-级数
  17. NavMesh生成研究(四):凸多边形生成
  18. 牛客网最热门的 Java 面试题库(附答案),终于整理好了
  19. 迅捷PDF文件转换Excel
  20. 抖音运营工具有哪些?让你玩转抖音

热门文章

  1. 垂直距页边距5厘米_Word页面设置,含纸张大小与方向、页边距和文字方向
  2. pulsar client jar包选择-shaded 还是original
  3. 1000geno_maf
  4. BigDecimal.divide异常 ArithmeticException
  5. python安装jupyterlab_Jupyter/JupyterLab安装使用
  6. 【What if 系列】拖住那架飞机!
  7. hexo(next)——每日一言、今日诗词
  8. AI 智能头像生成神器|PhotoShot
  9. OSChina 周日乱弹 —— 这个野男人是谁
  10. 接口测试之协议和常用工具安装使用