报错:Mapped Statements collection already contains value for XXX
大体意思是mapper映射集合的值已存在。
原因:在mybatis中注册StudentMappper.xml文件之后,又在spring.xml中又注册了一次,导致mapper文件多次注册报错。
解决:删除其中一个扫描即可
通过度娘浏览许多博客,总结下来有以下几个原因:
1、Mapper中存在了重复的id(同一个Mapper.xml 文件中重复出现了两个id 为XXX的方法)
2、有可能是parameterType和resultType,参数类型错误
3、有可能你的sqlSessionFactory中配置了多个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语句。