在我们开发过程中有时会遇到这个问题,大体意思是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的缓存,试着跑一边看看,我的项目属于最后一种情况,我只是把有问题的id改了一遍,并不确定问题是否解决,测试时并没有出现或者说再遇见,但有可能还会出现,大家可以研究研究。《小白爬坑记》
此文章属于原创