背景:
mybatis配置xml启动的时候报错,提示Result Maps collection already contains value for xxx。
原因分析:
同一个xml文件里写的sql id具有重名的情况,如下存在俩个id为select的命名就不行,解决办法就是修改其中一个命名。
<sql id="select">
select * from student
</sql>
<sql id="select">
select * from student
</sql>
但是改完以后,发现问题不是这么简单,继续深究
这么简单的问题题主肯定不会犯了,当你找遍了所有的xml,发现根本没有重复命名的情况。
那么启动还是报这个错,怎么处理?
1.首先明确问题原因,报错肯定是因为同一个namespace命名的xml,存在相同sql id的情况。
解决办法:
(1)对于同一个接口,使用多个xml对应的情况,要保证同一个namespace命名的xml内,不能存在重复sql id的情况。
(2)第二种就是隐藏比较深的情况,可能是打包导致的问题,排查是否打包后classes中存在多个相同的xml文件。
复现(2)的场景:
1.多模块工程,模块 分为a、b、c
2.在a模块里面写的a-mapper.xml文件,然后使用classpath*:mapper/*.xml,扫描文件
补一下这个命令的原理
classpath:只会到你的class路径中查找找文件;
classpath*:不仅包含class路径,还包括jar文件中(class路径)进行查找
3.然后maven打包(一般是maven-shade-plugin插件打包)后c模块里面也包含了a-mapper.xml这个文件
4.所以两个jar都被扫描到xml了,并且同一个namespace命名的xml内存在相同的命名,导致报错。