关于Mybatis出现Mapped Statements collection already contains value for XXX 错误(相对较全)

Mybatis出现Mapped Statements collection already contains value for 错误

在我们开发过程中有时会遇到这个问题,大体意思是mapper映射集合的值已存在,那么在此记录下我遇到此问题的寻找过程,小白一枚,不喜勿喷,有大佬看出问题请多指教…

在此过程中我也查询了许多相关博客,各种百度贴吧,然后总结了我自己认为可能的一些错误。
先从最简单的开始吧:

1、Mapper中存在了重复的id(同一个Mapper.xml 文件中重复出现了两个id 为XXX的方法)
那么就需要好好检查程序报错的地方,调用对应的mapper文件里的方法id了,看看是否id命名一样

2、有可能是parameterType和resultType,参数类型错误
仔细检查方法中的parameterType和resultType,查看相应的参数类型是否有错,或者有空的忘记写了。

3、有可能你的sqlSessionFactory中配置了多个xml的地址。
这时就需要仔细查看你的配置文件,是否将xml地址配重复了,将多余的删除掉。

4、若你项目中使用了2个xml文件去对应了一个.java文件,引用了同一个方法,而方法id相同就可能会出 现,比如:userDao.xml,userExlDao.xml,有多个mapper.xml, 执行sql时是随机找了一个xml来绑定ResultMap,就可能会出现此问题,那么这个时候就需要指定xml文件的加载顺序了。(这种情况比较少)

5、多数据源的情况下,同一mapper文件被扫描了多次,导致异常。

6、如果以上情况都排查过还无法解决,那么就需要手动更改id的命名了,保证同一命名空间下id唯一,在后台报错行查看是哪一个方法调用报错,更改id,这也是没办法的办法了。

7、还有一种情况,就是多线程并发访问时会出现此问题,几乎在同一秒内甚至同一毫秒内程序执行调用多次,扫描mapper文件调用方法时会出现,对此我也比较头大,因为对这个多线程访问不是很熟,虽然没有手动写多线程开启,但是Java程序默认就是多线程,所以会有并发访问。(这个方式是找来的,没有实践过,提供大家参考)
解决方式:mybaits初始化时加上sqlSesssionTemplate.getConfiguration().buildAllStatement。让Mybatis初始化时就编译sql语句。
注:这个问题后来经项目实践,确定是同步并发查询数据库造成的,我的最终解决办法就是给代码加上同步块,或者方法加同步,这个问题得以解决,但目前是否有其他解决办法也尚不得知,这个解决方法是自己想的,如果有哪位高手有更好的解决办法希望不吝赐教,可以留言给我

以上就是我总结的可能的原因,尽可能的先排查然后清除tomcat的缓存,试着跑一边看看,我的项目属于最后一种情况,并不确定问题是否彻底解决,在后来测试中并没有出现或者说再遇见,实际情况,大家可以研究研究。


有用的话希望不吝点赞哦!

你可能感兴趣的:(mybatis,数据库)