org.apache.ibatis.builder.IncompleteElementException: Could not find parameter map

作者在使用MyBatis时遇到参数映射错误,由于将parameterType误写为parameterMap,导致接口调用出现问题。文章详细记录了这一错误的发现过程及解决办法。

我的bug,但是让我觉得mybatis也有不够友好的地方!!!

问题临床表现:

Caused by: org.apache.ibatis.builder.IncompleteElementException: Could not find parameter map java.lang.Long:

这里写图片描述

原因点:
把parameterType 顺手写成了:parameterMap,导致了此次错误。

这里写图片描述

折腾了好久才发现这个问题!!!

我调用的接口方法是 A***DAO.delete(Long id),但是我在debug的时候发现怎么是 :B**DAO.list(**)方法,这时候才恍然大雾,错误在这B对应的mapper.xml里
这里写图片描述

吐槽下mysql:

虽然是我的bug,但是我的sqlmapper文件有好几十个,而且是刚刚搭建的项目,没有git历史记录,不好查看到底那个文件错误,一个个翻阅太鸡吧累了!!!能不能主动提示出来啊!!!!

异常报告 消息 Request processing failed; nested exception is org.apache.ibatis.builder.IncompleteElementException: Could not find result map 'cn.com.mapper.User1Mapper.userMap' referenced from 'cn.com.mapper.User1Mapper.listBooksByUserid' 描述 服务器遇到一个意外的情况,阻止它完成请求。 例外情况 org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.apache.ibatis.builder.IncompleteElementException: Could not find result map 'cn.com.mapper.User1Mapper.userMap' referenced from 'cn.com.mapper.User1Mapper.listBooksByUserid' org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) javax.servlet.http.HttpServlet.service(HttpServlet.java:555) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) javax.servlet.http.HttpServlet.service(HttpServlet.java:623) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) 根本原因。 org.apache.ibatis.builder.IncompleteElementException: Could not find result map 'cn.com.mapper.User1Mapper.userMap' referenced from 'cn.com.mapper.User1Mapper.listBooksByUserid' org.apache.ibatis.builder.MapperBuilderAssistant.getStatementResultMaps(MapperBuilderAssistant.java:341) org.apache.ibatis.builder.MapperBuilderAssistant.addMappedStatement(MapperBuilderAssistant.java:285) org.apache.ibatis.builder.xml.XMLStatementBuilder.parseStatementNode(XMLStatementBuilder.java:113) org.apache.ibatis.session.Configuration.lambda$buildAllStatements$2(Configuration.java:816) java.base/java.util.Collection.removeIf(Collection.java:576) org.apache.ibatis.session.Configuration.buildAllStatements(Configuration.java:815) org.apache.ibatis.session.Configuration.hasStatement(Configurat
最新发布
05-31
### 解决方案 在 MyBatis 中,`IncompleteElementException: Could not find result map` 异常通常表明 MyBatis 无法找到指定的 `resultMap`。以下是可能导致该问题的原因及解决方案: #### 1. **检查 resultMap 是否正确配置** 确保 `resultMap` 的名称与 Mapper 接口中的方法引用一致。例如,如果在 Mapper 文件中定义了以下 `resultMap`: ```xml <resultMap id="userMap" type="cn.com.model.User"> <id property="id" column="user_id"/> <result property="name" column="user_name"/> </resultMap> ``` 那么在 SQL 查询中必须正确引用它: ```xml <select id="listBooksByUserid" parameterType="int" resultMap="userMap"> SELECT * FROM users WHERE user_id = #{userid} </select> ``` 上述代码中,`resultMap="userMap"` 必须与 `<resultMap id="userMap">` 的定义匹配[^1]。 #### 2. **命名空间是否正确** MyBatis 的 XML 配置文件需要一个正确的 `namespace` 属性来关联到对应的 Mapper 接口。例如: ```xml <mapper namespace="cn.com.mapper.User1Mapper"> <!-- resultMap 和 select 定义 --> </mapper> ``` 如果 `namespace` 不正确或未定义,则 MyBatis 无法将 `resultMap` 或 SQL 语句映射到正确的接口[^2]。 #### 3. **检查 resultMap 的位置** 如果 `resultMap` 定义在其他 Mapper 文件中,确保通过 `import` 标签引入相关文件。例如: ```xml <mapper namespace="cn.com.mapper.User1Mapper"> <import resource="other-mapper.xml"/> <select id="listBooksByUserid" parameterType="int" resultMap="userMap"> SELECT * FROM users WHERE user_id = #{userid} </select> </mapper> ``` 如果没有正确导入外部的 `resultMap`,MyBatis 将无法识别它[^2]。 #### 4. **类路径扫描问题** 确保 MyBatis 配置文件(如 `mybatis-config.xml`)正确加载了所有的 Mapper 文件。例如: ```xml <mappers> <mapper resource="cn/com/mapper/User1Mapper.xml"/> </mappers> ``` 如果 Mapper 文件未被正确加载,MyBatis 将无法识别其中的 `resultMap`[^1]。 #### 5. **类型别名冲突** 检查是否有类型别名冲突。如果 `typeAlias` 配置不正确,可能导致 MyBatis 无法正确解析 `resultMap` 中的实体类。例如: ```xml <typeAliases> <typeAlias alias="User" type="cn.com.model.User"/> </typeAliases> ``` 确保别名与实际类路径一致[^1]。 #### 示例代码 以下是一个完整的示例,展示如何正确配置 `resultMap` 和 SQL 查询: ```xml <!-- mybatis-config.xml --> <configuration> <typeAliases> <typeAlias alias="User" type="cn.com.model.User"/> </typeAliases> <mappers> <mapper resource="cn/com/mapper/User1Mapper.xml"/> </mappers> </configuration> <!-- User1Mapper.xml --> <mapper namespace="cn.com.mapper.User1Mapper"> <resultMap id="userMap" type="User"> <id property="id" column="user_id"/> <result property="name" column="user_name"/> </resultMap> <select id="listBooksByUserid" parameterType="int" resultMap="userMap"> SELECT * FROM users WHERE user_id = #{userid} </select> </mapper> ``` #### 注意事项 - 确保 `resultMap` 的 `id` 是唯一的,并且在整个 Mapper 文件中没有重复。 - 如果使用注解方式,确保 `@Results` 和 `@Result` 的配置与实体类字段匹配[^2]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值