IllegalArgumentException: Mapped Statements collection already contains value for ***Mapper.insert!s

本文解析了MyBatis中因方法名重复导致的IllegalArgumentException异常,深入分析了问题原因,并提供了详细的解决步骤,包括检查重复ID和调整方法名,适用于自定义Mapper及逆向工程生成的代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一:异常/错误

二:分析/排查

三:解决方法


一:异常/错误

IllegalArgumentException: Mapped Statements collection already contains value for ***Mapper.insert!selectKey

[artifact:mvn] 2016-05-07 11:39:21,708 [ERROR] org.mybatis.spring.mapper.MapperFactoryBean - Error while adding the mapper 'interface com.sample.mappers.UserMapper' to configuration.
[artifact:mvn] java.lang.IllegalArgumentException: Mapped Statements collection already contains value for com.sample.mappers.UserMapper.getAllUsers
[artifact:mvn]  at org.apache.ibatis.session.Configuration$StrictMap.put(Configuration.java:802)
[artifact:mvn]  at org.apache.ibatis.session.Configuration$StrictMap.put(Configuration.java:774)
[artifact:mvn]  at org.apache.ibatis.session.Configuration.addMappedStatement(Configuration.java:598)
[artifact:mvn]  at org.apache.ibatis.builder.MapperBuilderAssistant.addMappedStatement(MapperBuilderAssistant.java:300)
[artifact:mvn]  at org.apache.ibatis.builder.annotation.MapperAnnotationBuilder.parseStatement(MapperAnnotationBuilder.java:313)
[artifact:mvn]  at org.apache.ibatis.builder.annotation.MapperAnnotationBuilder.parse(MapperAnnotationBuilder.java:128)
[artifact:mvn]  at org.apache.ibatis.binding.MapperRegistry.addMapper(MapperRegistry.java:72)
[artifact:mvn]  at org.apache.ibatis.session.Configuration.addMapper(Configuration.java:671)
[artifact:mvn]  at org.mybatis.spring.mapper.MapperFactoryBean.checkDaoConfig(MapperFactoryBean.java:81)
[artifact:mvn]  at org.springframework.dao.support.DaoSupport.afterPropertiesSet(DaoSupport.java:44)

二:分析/排查

出现这个错误的意思是:SQL标签中有 id 重复的标签,或者说有相同的方法名称

 

三:解决方法

解决方案:为不同的映射器语句使用不同的方法名称,即使方法签名不同。

  1. 如果是自己写的mapper,建议手动排查是否有重复id的sql,例如: https://blog.youkuaiyun.com/kingscoming/article/details/78897459

  2. 如果是通过mybatis逆向工程生成的代码,那肯定是不会有重复的id,那么问题很可能出现在同时有xml配置文件的mapper和java注解的mapper,删除一个就好了

 

ref:https://stackoverflow.com/questions/37085803/mybatis-mapped-statements-collection-already-contains-value-for

<think>嗯,用户遇到了Java中的异常:java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for EmployeeMapper.findAllEmployee。需要帮他们解决这个问题。首先,我要回忆一下MyBatis常见的这类错误原因。根据引用[4]提到的,可能的原因包括命名空间不符、映射文件命名问题、方法名和id不一致,或者配置文件没添加映射文件。 首先,我应该检查命名空间是否正确。用户提到的EmployeeMapper.findAllEmployee,所以需要确认Mapper接口的完整路径是否与XML中的namespace一致。例如,如果接口在main.resources.mapper包下,那么XML里的namespace应该是这个路径。 然后,映射文件的名称和位置也很重要。通常,MyBatis要求XML文件与Mapper接口同名,并且放在对应的资源目录下。比如,EmployeeMapper.java对应EmployeeMapper.xml,放在resources/mapper目录里。用户可能把XML文件放错位置或者命名不正确。 接下来是方法名和XML中的id是否匹配。findAllEmployee这个方法名必须和XML里<select>标签的id属性一致。如果有拼写错误,比如大小写不一致或者拼写错误,就会导致这个问题。 另外,MyBatis的配置文件(如mybatis-config.xml)需要正确引入映射文件。用户可能忘记在配置文件中添加<mapper>标签,或者路径写错了。如果是Spring Boot项目,可能是在application.properties里配置了mybatis.mapper-locations,需要检查这个路径是否正确。 还有可能是构建工具的问题,比如Maven或Gradle没有正确将XML文件打包到输出目录。这时候需要检查构建配置,确保资源文件被包含进去。例如,Maven的pom.xml里需要包含<resources>配置,把src/main/resources下的文件包含进去。 用户可能没有提到具体的项目结构,所以需要提醒他们检查这些方面。此外,清理和重新构建项目有时候也能解决问题,因为可能存在缓存或未更新的文件。 总结下来,解决步骤应该是:检查XML的namespace和方法id,确认文件位置和命名,检查配置文件中的映射路径,以及确保构建工具正确处理资源文件。如果用户按照这些步骤逐一排查,应该能找到问题所在并解决异常。</think>### 解决方案:`Mapped Statements collection does not contain value for EmployeeMapper.findAllEmployee` 此异常通常与**MyBatis映射文件配置错误**相关,以下是逐步排查和解决方法: --- #### **1. 检查Mapper接口与XML文件的命名空间一致性** - **问题根源**:Mapper接口的完整类名必须与XML文件中`<mapper>`的`namespace`属性完全一致。 - **示例验证**: ```xml <!-- EmployeeMapper.xml --> <mapper namespace="main.resources.mapper.EmployeeMapper"> <select id="findAllEmployee" resultType="Employee"> SELECT * FROM employee </select> </mapper> ``` - `namespace`必须对应Mapper接口的**全限定名**(包括包路径),例如`main.resources.mapper.EmployeeMapper`。 - 常见错误:包路径层级错误或大小写不一致[^4]。 --- #### **2. 验证XML文件位置与命名规范** - **文件位置**: - Maven/Gradle项目需将XML文件放在`src/main/resources`对应的目录下(例如`resources/mapper/EmployeeMapper.xml`)。 - Spring Boot项目需在`application.properties`中配置`mybatis.mapper-locations=classpath:mapper/*.xml`。 - **命名规则**:XML文件名应与Mapper接口名一致(如`EmployeeMapper.xml`对应`EmployeeMapper.java`)。 - 常见错误:XML文件未被编译到`target/classes`目录下,需检查构建工具的资源配置(如Maven的`pom.xml`需包含`<resources>`标签)[^4]。 --- #### **3. 检查方法名与XML标签的id匹配性** - **Mapper接口方法名**必须与XML中SQL语句的`id`属性**严格一致**,包括大小写。 - **示例对比**: ```java // EmployeeMapper.java public interface EmployeeMapper { List<Employee> findAllEmployee(); // 方法名 } ``` ```xml <!-- XML中的id必须与方法名一致 --> <select id="findAllEmployee" resultType="Employee">...</select> ``` - 常见错误:`id`拼写错误或使用了下划线命名(如`find_all_employee`)[^3]。 --- #### **4. 确认MyBatis配置中加载了XML文件** - **配置方式**: - 在`mybatis-config.xml`中添加: ```xml <mappers> <mapper resource="mapper/EmployeeMapper.xml"/> </mappers> ``` - 或在Spring Boot的`application.properties`中配置: ```properties mybatis.mapper-locations=classpath*:mapper/**/*.xml ``` - 常见错误:路径配置错误(如`mapper/`写成`mappers/`)。 --- #### **5. 清理并重新构建项目** - **操作步骤**: 1. 执行Maven的`mvn clean install`或Gradle的`gradle clean build`。 2. 检查`target/classes/mapper`目录下是否生成了XML文件。 - 常见错误:IDE缓存导致未加载最新文件。 --- ### 总结流程图 ``` 检查命名空间 → 验证文件位置 → 匹配方法名与id → 检查MyBatis配置 → 清理构建 ``` 若仍报错,可使用**MyBatis日志调试**(配置`log4j.logger.org.mybatis=DEBUG`)查看SQL映射加载过程。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值